Home > front end >  Why does printing from this struct give a segmentation fault?
Why does printing from this struct give a segmentation fault?

Time:03-15

I'm trying to create an array of Product structs and then print the name and code of each Product in the array, but I keep getting a segmentation fault. I have tried to insert each value without a loop and then printing, and it works, but I'd like to automate it. The function fill_products fills the products array according to the user's input, and the select_products prints each name-code pair for the entire array.

This is my code:

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int code;
    char *name;
    float price;
} Product;

void select_products(Product *products, int len)
{
    int i;

    printf("%-30s%s\n", "Name", "Code");
    for (i = 0; i < len; i  )
    {
        printf("%-30s%d\n", products[i].name, products[i].code);
    }

    return;
}

void fill_products(Product *products, int len)
{
    int i, code;
    char *name;
    float price;

    for (i = 0; i < len; i  )
    {
        printf("Insert product name (%d / %d): ", i   1, len);
        scanf("%s", &name);
        printf("Insert product price (%d / %d): ", i   1, len);
        scanf("%f", &price);

        products[i].code = i;
        products[i].name = name;
        products[i].price = price;
    }

    return;
}

int is_alloc(Product *products)
{
    if (products == NULL)
    {
        printf("Error: memory allocation unsuccessful.\n");
    }
    return products != NULL;
}

int main(void)
{
    int len, n_bytes;
    Product *products;

    printf("Insert length of array: ");
    scanf("%d", &len);

    n_bytes = sizeof *products * len;
    products = malloc(n_bytes);

    if(!is_alloc(products))
    {
        exit(0);
    }

    fill_products(products, len);
    select_products(products, len);

    free(products);

    return 0;
}

CodePudding user response:

I keep getting a segmentation fault.

Please enable compiler warnings, and pay attention to them.

This code:

    char *name;
...
        scanf("%s", &name);

is bogus and doesn't do at all what you intend.

You must either allocate space for name separately (and then not forget to free() it), or make that space available in the Product structure like so:

typedef struct
{
    int code;
    char name[100];
    float price;
} Product;

(this assumes there is a reasonable limit on name length).

  • Related