【问题标题】:Segmentation fault when using malloc with double pointers使用带双指针的 malloc 时出现分段错误
【发布时间】:2018-09-11 00:53:33
【问题描述】:

这段代码不起作用,我不知道为什么,我完全按照教授告诉我们的方式使用了所有东西,我认为它应该起作用,为什么编译器会抛出 Segmentation fault(core dumped) 异常。我做错了什么?

int main() {
    int n;
    char *chr;
    char pchr;
    scanf("%s", chr);
    scanf(" %d", &n);

    char **table = (char **) malloc(n * sizeof(char*));
    char *chr2 = chr;
}

这只是我的程序的一部分,但是当我只运行这个代码时,编译器会抛出异常。它甚至不扫描n 数字它只扫描char 然后抛出异常。谢谢你的回答。

【问题讨论】:

  • 指针 chr 具有不确定的值。结果,由于语句 scanf("%s", chr); ,程序具有未定义的行为。
  • 如果您启用警告,您的编译器应该会告诉您类似“使用未初始化的变量 chr”的内容。
  • Scant 读取标准输入并将与模式(格式)匹配的内容存储在 chr 指向的内存中。哪个是 undef。

标签: c segmentation-fault malloc stack-overflow


【解决方案1】:

您显然已经注意到,问题就在这里:

char *chr;
scanf("%s", chr);

scanf 所做的是将它从控制台输入读取的字符串放入由chr 指向的某个内存地址中。正如一些人已经提到的,您的问题有两个方面

  1. chr 未初始化,因此给您未定义的行为,因为该变量具有不确定的值。请参阅this answer 了解为什么会这样。
  2. chr 必须指向一些分配的内存。这可以通过几种方式完成,1) 通过使用char[] 或与malloc 和朋友一起分配内存。

所以有两种方法可以解决:

#define BUFFERSIZE 50
char chr[BUFFERSIZE] = {'\0'};
scanf("%s", chr);

char* chr = calloc(BUFFERSIZE, sizeof(char));
scanf("%s", chr);
free(chr);
chr = NULL;

接下来,这条线并没有按照你的想法做:

char **table = (char **) malloc(n * sizeof(char*));

请参阅this answer 了解如何分配指针列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2012-10-08
    • 2017-03-10
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多