c - 使用带有双指针的 malloc 时出现段错误

标签 c segmentation-fault malloc stack-overflow

这段代码不起作用,我不知道为什么,我完全按照教授告诉我们的那样使用了所有内容,我认为它应该起作用,为什么编译器会抛出段错误(核心转储)异常。我做错了什么?

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,然后抛出异常。谢谢您的解答。

最佳答案

正如您显然注意到的,问题在这里:

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

关于c - 使用带有双指针的 malloc 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49600550/

相关文章:

c - qsort使用什么排序算法?

C 参数转换

c - 我应该检查 malloc() 是否成功吗?

c - 如何在 C 中使用结构体和指针的指针中的索引

c - 免费动态分配的内存

c - 将内存转储到文件

c - 不带字符串逐个字母地阅读文本

c++ - 使用以 vector 为输入的递归方法时的段错误

exception - 缓存未命中是一种中断/故障吗

c++ - 读取文件夹中的文件列表时获取分段 fold