2

我是 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;
}
4

5 回答 5

8

这是你的问题:

str *p;

您已经声明了一个指向 的实例的指针str,但您还没有使用值对其进行初始化。您要么需要将此变量移动到堆栈中:

str p;

...或malloc首先对其进行一些记忆:

str *p = (str*)malloc(sizeof(str));
于 2012-10-18T05:04:22.890 回答
5

你从来没有为结构本身分配空间,只有一个指向它的指针。

尝试类似:

str *p = malloc(sizeof(str));
于 2012-10-18T05:04:10.067 回答
2

正如许多人指出的那样,您需要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

于 2012-10-18T07:48:07.197 回答
0

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

<也str *p;没有初始化。

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

于 2012-10-18T05:06:20.240 回答
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 可以指向任何导致段错误的地方。下面是正确的方法

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

现在你有一个 p 指向的初始化内存。您现在可以随意使用它。

于 2012-10-18T05:39:09.797 回答