Reputation: 1962
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;
}
Upvotes: 2
Views: 9834
Reputation: 2155
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.
Upvotes: 0
Reputation: 399723
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:
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:
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
.
Upvotes: 2
Reputation: 26843
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));
Upvotes: 8
Reputation: 25695
Check for NULL values in return of malloc()
function.
Also str *p;
< is not initialised.
initialize p as str *p = malloc(sizeof(str));
Upvotes: 0
Reputation: 40337
You never allocated space for the struct itself, only a pointer to it.
Try something like:
str *p = malloc(sizeof(str));
Upvotes: 5