繁体   English   中英

使用带有char指针的malloc时出现分段错误

[英]Segmentation fault while using malloc with char pointers

我是C的新手并且学习结构。 我试图malloc一个大小为30的char指针,但它给出了一个分段错误(核心转储)。 我在互联网上搜索了它,但是我无法解决这个问题。 任何帮助都感激不尽。
可能我错误地访问了结构的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;
}

这是你的问题:

str *p;

您已经声明了一个指向str实例的指针,但是您没有用值初始化它。 您需要将此变量移动到堆栈:

str p;

...或malloc先为它的一些记忆:

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

你从未为结构本身分配空间,只是指向它的指针。

尝试类似的东西:

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

正如许多人所指出的那样,在编写str字段之前,需要为str结构分配内存。

在C中这样做的最佳方法是:

p = malloc(sizeof *p);

这具有以下优点:

  1. 没有强制转换,因为C中不需要强制转换并且使用强制转换可以隐藏实际错误。
  2. 通过使用sizeof运算符计算值p指向需要多少存储空间,不会重复类型信息。

然后,当您分配字符串空间时,可以将其简化为:

p->f = malloc(30); 

因为:

  1. 没有演员,出于同样的原因
  2. C保证sizeof (char)总是1,所以像你一样使用它不会增加任何东西, 1 * 30总是只有30

最后,您应该在使用之前检查 malloc()的返回值,因为它可能会失败并返回NULL

检查返回malloc()函数的NULL值。

str *p; <未初始化。

将p初始化为str *p = malloc(sizeof(str));

问题出在这里。

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指向的初始化内存。 您现在可以随意使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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