这段代码不起作用,我不知道为什么,我完全按照教授告诉我们的那样使用了所有内容,我认为它应该起作用,为什么编译器会抛出段错误(核心转储)异常。我做错了什么?
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
指向的某个内存地址中。正如有些人已经提到的,你的问题有两个方面
chr
未初始化,因此会产生未定义的行为,因为该变量具有不确定的值。请参阅this answer了解原因的信息。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/