首页 文章

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

提问于
浏览
2

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

5 回答

  • 2

    这是你的问题:

    str *p;
    

    您已声明指向 str 实例的指针,但尚未使用值初始化它 . 您需要将此变量移动到堆栈:

    str p;
    

    ...或 malloc 首先为它准备一些内存:

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

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

    尝试类似的东西:

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

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

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

    p = malloc(sizeof *p);
    

    这具有以下优点:

    • 没有强制转换,因为no cast is needed in C并且拥有强制转换可以隐藏实际错误 .

    • 没有重复的类型信息,通过使用 sizeof 运算符计算值 p 指向需要多少存储空间 .

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

    p->f = malloc(30);
    

    因为:

    • 无投,the very same reason .

    • C保证 sizeof (char) 始终为1,所以像你一样使用它不会增加任何内容, 1 * 30 始终只是 30 .

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

  • 8

    检查NULL值以返回 malloc() 函数 .

    此外 str *p; <未初始化 .

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

  • 4

    问题出在这里 .

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

相关问题