我在下面的change((函数中遇到了malloc问题。当i=5时,当我读取并试图将输入行保存在s中时,表[4]发生变化,调试器说:"<错误:无法访问地址0xa69673>处的内存&";,即使在该值正确之前。使用scanf而不是fgets或打印表[3]的值也会出现同样的问题。
(我在Windows10的Linux子系统中使用gcc -std=gnu11 -g
在Ubuntu上的VS代码中进行编译和gdb调试(
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char **table;
int change()
{
char s[1025];
for(int i = 0; i <= 6; i++)
{
fgets(s, 1024, stdin);
//scanf(" %1024[^n]%*c", s);
table[i] = (char *) malloc(strlen(s) + 1);
strcpy(table[i], s);
}
}
int main()
{
table = malloc(10);
change();
return 0;
}
读取第六(i=5(行之前的值
读取第六(i=5(行后的值
错误在这里:
table = malloc(10);
这分配了10个字节的存储空间,这不足以容纳7个指针(change
中的循环循环7次(。您应该使用类似malloc(7 * sizeof(char *));
的内容。
将来,当您遇到这样的错误时,请尝试在valgrind
调试实用程序下运行该程序。在这种情况下,它会清楚地告诉你,你正在写超过分配给table
的空间的末尾。
作为参考,sizeof(char *)
几乎总是四或八。