简体   繁体   中英

Segmentation fault while using malloc with char pointers

I am new to C and learning structs. I am trying to malloc a char pointer with size 30 but it is giving a segmentation fault(core dump). I searched it on the internet & SO but am not able to resolve this. Any help will be much appreciated.
Probably I am accessing the char* member of the struct incorrectly ?

typedef struct{
int x;
int y;
char *f;
char *l;
}str;

void create_mall();

void create_mall() //Malloc the struct
{
str *p;
p->f = (char*)malloc(sizeof(char)*30);  // segmentation fault here
p->l = (char*)malloc(sizeof(char)*30);
printf("Enter the user ID:");
scanf("%d",&p->x);
printf("\nEnter the phone number:");
scanf("%d",&p->y);
printf("\nEnter the First name:");
scanf("%29s",p->f);
printf("\nEnter the Last name:");
scanf("%29s",p->l);
printf("\nEntered values are: %d %d %s %s\n",p->x,p->y,p->f,p->l);
}

int main(void)
{
create_mall();
return 0;
}

Here's your problem:

str *p;

You've declared a pointer to an instance of str , but you haven't initialized it with a value. You either need to move this variable to the stack:

str p;

...or malloc some memory for it first:

str *p = (str*)malloc(sizeof(str));

You never allocated space for the struct itself, only a pointer to it.

Try something like:

str *p = malloc(sizeof(str));

As many people have pointed out, you need to allocate memory for that str struct, before writing the fields of it.

The best way to do so in C is:

p = malloc(sizeof *p);

This has the following advantages:

  1. No cast, since no cast is needed in C and having a cast can hide actual errors.
  2. No duplication of type information, by using the sizeof operator to compute how much storage is needed for the value p points at.

When you then allocate the string space, you can simplify it to:

p->f = malloc(30); 

Because:

  1. No cast, for the very same reason .
  2. C guarantees that sizeof (char) is always 1, so using it like you did adds nothing, 1 * 30 is always just 30 .

Last, you should always check the return value of malloc() before using it, since it can fail and return NULL .

Check for NULL values in return of malloc() function.

Also str *p; < is not initialised.

initialize p as str *p = malloc(sizeof(str));

The problem lies here.

str *p;   ---> Problem Line 1<br>
p->f = (char*)malloc(sizeof(char)*30); ----> Problem  Line2
p->l = (char*)malloc(sizeof(char)*30);

You have declared a pointer p of type str.
Problem 1:
You have not initialized this pointer to NULL. Thus, p can point to anything.
Problem 2:
Since p is an uninitialized pointer, p->f can point anywhere which is causing the segfault. Below is the correct way

str *p = NULL;
p = malloc(sizeof(str));
// Check p for NULL
memset(p, 0, sizeof(str));

Now you have an initialized memory pointed by p. You are now free to use it as you want.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM