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; }