Kyuu
Kyuu

Reputation: 1045

Malloc an array inside a struct

I'm trying to malloc an array inside a struct but I keep getting segmentation errors when I run the program.

The compares function is just something I'm testing so it shouldn't be a part of the problem

typedef struct {
    char *string;
} prod_t;

int
main(int agrc, char **argv){
    int i = 0;
    prod_t *c = NULL;

    char str2[100] = "abcd";
    c->string = (char *) malloc( 5 * sizeof(char));
    strcpy(c->string,str2);

    compares(c->stock,str2,i);

    return 0;
}

Upvotes: 9

Views: 14947

Answers (3)

rost0031
rost0031

Reputation: 1926

First of all, don't cast result of malloc. You only need to do that in C++. In C, it can actually hide potential problems.

Second of all, you need to allocate (or statically declare) your structure.

Third, c->stock doesn't exist. You probably meant c->string.

typedef struct {
    char *string;
} prod_t;

int
main(int agrc, char **argv) {
    int i = 0;
    prod_t *c = malloc( sizeof( prod_t ));


    char str2[100] = "abcd";
    c->string = malloc( 5 * sizeof(char));
    strcpy(c->string,str2);

    compares(c->string,str2,i);

    return 0;
}

Upvotes: 2

Barmar
Barmar

Reputation: 782785

You need to allocate space for the struct before you can assign to the string member:

prod_t *c = malloc(sizeof(prod_t));

Also see Do I cast the result of malloc?

Upvotes: 4

Marco A.
Marco A.

Reputation: 43662

The problem is that you're allocating space for the string, but you're not allocating the struct at all. c remains set to NULL and you're trying to dereference it.

Allocate space for the struct before assigning to its members

prod_t *c = malloc(sizeof(prod_t));

And, as a sidenote for your next-to-fix error: this field doesn't exist

c->stock

Upvotes: 5

Related Questions