我是C新手和学习结构。我试图malloc
一个大小为30的字符指针,但是它给出了一个分段错误(核心转储)。我在互联网上搜索了它所以,但我无法解决这个问题。任何帮助将不胜感激。
可能我错误地访问了结构的char*
成员?
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;
}
答案 0 :(得分:8)
这是你的问题:
str *p;
您已声明指向str
实例的指针,但尚未使用值初始化它。您需要将此变量移动到堆栈:
str p;
首先是 ...或malloc
一些记忆:
str *p = (str*)malloc(sizeof(str));
答案 1 :(得分:5)
你从未为结构本身分配空间,只是指向它的指针。
尝试类似:
str *p = malloc(sizeof(str));
答案 2 :(得分:2)
正如许多人所指出的那样,在编写字段之前,需要为该str
结构分配内存。
在C中这样做的最佳方法是:
p = malloc(sizeof *p);
这具有以下优点:
sizeof
运算符计算值p
点所需的存储量,不会出现类型信息重复。然后分配字符串空间时,可以将其简化为:
p->f = malloc(30);
由于:
sizeof (char)
始终为1,因此像您一样使用它不会增加任何内容,1 * 30
始终只是30
。最后,在使用之前,您应始终检查 malloc()
的返回值,因为它可能会失败并返回NULL
。
答案 3 :(得分:0)
检查NULL值以返回malloc()
函数。
另外str *p;
<没有初始化。
将p初始化为str *p = malloc(sizeof(str));
答案 4 :(得分:0)
问题出在这里。
str *p; ---> Problem Line 1<br>
p->f = (char*)malloc(sizeof(char)*30); ----> Problem Line2
p->l = (char*)malloc(sizeof(char)*30);
你已经声明了一个str类型的指针p
问题1:
您尚未将此指针初始化为NULL。因此,p可以指向任何东西
问题2:
由于p是未初始化的指针,因此p-> f可以指向导致segfault的任何地方。
以下是正确的方法
str *p = NULL;
p = malloc(sizeof(str));
// Check p for NULL
memset(p, 0, sizeof(str));
现在你有一个由p指向的初始化内存。您现在可以随意使用它。