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

时间:2018-04-01 17:08:56

标签: c segmentation-fault malloc stack-overflow

这段代码不起作用,我不知道为什么,我使用了所有内容,正如我的教授告诉我们的,我认为它应该有效,为什么编译器会抛出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的{​​{1}}数字,然后抛出异常。谢谢你的回答。

1 个答案:

答案 0 :(得分:0)

正如你明显注意到的,问题出在这里:

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

scanf做的是将从控制台输入读取的字符串放入chr指向的某个内存地址。正如一些人已经提到的,你的问题在这里是双重的

  1. chr未初始化,从而为您提供未定义的行为,因为该变量具有不确定的值。有关原因的信息,请参阅this answer
  2. chr必须指向一些已分配的内存。这可以通过几种方式完成,1)使用char[]或使用malloc和朋友分配内存。
  3. 所以有两种方法可以解决这个问题:

    #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,了解如何分配指针列表。