Estoy tratando de aprender struct en C. El código cumple bien, cuando intento ingresar un valor, se bloquea. Lo intenté con un miembro int y funciona.

typedef struct node{
    char *productName;
    int price;
    struct node *next;

}node;

int main (){
    node *head = (node*) malloc(sizeof(node));
    printf("Enter a product name: ");
    scanf("%s", &head->productName);
    printf("Product entered:%s",head->productName);
    //scanf("%d", &head->price); // this works
    //printf("Price entered:%d",head->price);

}
1
Gavin 27 dic. 2016 a las 07:32

3 respuestas

La mejor respuesta

El primer problema, %s con scanf() espera un argumento char *, lo que estás pasando es un char **.

Dicho esto, incluso después de corregir eso ( eliminar & ), head->productName no se ha inicializado y no apunta a una ubicación de memoria válida. El acceso a la memoria no inicializada invoca comportamiento indefinido.

Debe hacer que el puntero apunte a una memoria válida antes de poder leer o escribir en ella.

Finalmente, siempre debe verificar el éxito de malloc() antes de usar el puntero devuelto.

Combinando todas ellas, algo así como

node *head = malloc(sizeof *head);
if (head) {
    head->productName = malloc(32); //some arbitary size
    if (head->productName) {
        printf("Enter a product name: ");
        scanf("%31s", head->productName);
        printf("Product entered:%s",head->productName);
    }
}

Debería hacer el trabajo.


Nota: Un consejo genérico, no olvide free() el puntero devuelto por las funciones del asignador de memoria para evitar cualquier posible pérdida de memoria, a medida que su código crece.

2
Sourav Ghosh 27 dic. 2016 a las 04:42

Prueba esto

scanf("%ms", &head->productName);

Ver how-can-i-read-an-input- cadena de longitud desconocida

Puede ser esto lo que estás buscando.

0
Community 23 may. 2017 a las 12:24

Probablemente, necesites escribir algo como esto:

/*Following code is not tested - Just a sample*/
typedef struct node{
    char *productName;
    int price;
    struct node *next;
}node;

int main (){
    node *head = (node*) malloc(sizeof(node));
    if( head == NULL ) 
     /*fail*/
    printf( "Size of product name:");
    scanf( "%d",&size);
    head->productName = malloc(size);
    if( head->productName == NULL ) {
       /*fail*/
    }
    printf("Enter a product name: ");
    scanf("%s", head->productName);
    printf("Product entered:%s",head->productName);
    /*scanf("%d", &head->price); // this works
      printf("Price entered:%d",head->price);*/

    /*Do stuff with node here*/
    free(head->productName);
    free(head);
    return 0;
}
1
Shivendra Mishra 27 dic. 2016 a las 04:44