Cómo almacenar una cadena de caracteres en un puntero de carácter declarado en una estructura

Este es mi código:

#include struct p{ char* d; }; typedef struct p* pt; int main(){ pt opt; opt=(pt)malloc(sizeof(struct p)); scanf("%s",(opt->d)); printf("%s",opt->d); getch(); return 0; } 

Cada vez que lo ejecuto, acepta e imprime la cadena bien, pero se produce un error. En la depuración, indica que hay una falla de segmentación pero no apunta a dónde está. Lo que va mal, parece ser bastante correcto.

el scanf puso la cadena escaneada en un búfer de caracteres. pero en su código, el puntero de su char no apunta a nada, debe apuntarse a un búfer

Si su gcc> 2.7, puede usar "%ms" . Esto permitirá escanear para asignar memoria a su puntero.

 scanf("%ms",(opt->d)); 

Usó malloc para asignar espacio para su estructura, pero no para la cadena que desea leer. También debe hacerlo. Aquí hay un ejemplo parafraseado de tu pregunta:

  pt opt = malloc(sizeof(struct p)); opt->d = malloc(MAX_STRING_LENGTH); 

Sí, el problema es que tienes que asignar memoria para char * d;

1) Asignó la memoria para char * d like (mencionado en la respuesta anterior)
opt->d = malloc(expected_max_len + 1);

2) O puede declarar el búfer con la longitud máxima del búfer en la estructura:
char d[MAX_LENGTH];

Tienes que asignar memoria para char* d;

 int main(){ pt opt; opt=(pt)malloc(sizeof(struct p)); opt->d = malloc( sizeof( char )* 80); scanf("%s",(opt->d)); //this might overflow 

Necesita pasar el búfer correcto para scanf no solo el puntero de punto a lugar.

 struct p{ char* d; }; typedef struct p* pt; int main(){ pt opt; opt=(pt)malloc(sizeof(struct p)); opt->d = malloc(expected_max_len + 1); scanf("%s",(opt->d)); printf("%s",opt->d); free(opt->d); getch(); return 0; }