我正在做一个简单的代码来打开带有矩阵的文件,但是我遇到了一个奇怪的错误。这是我的代码:
char** CM;
char** ACM;
int lines, columns;
int i, j;
//read file
FILE* file = fopen("matrix.txt", "r");
fscanf(file, "%i %i", &lines, &columns);
CM = (char**)malloc(sizeof(char)*lines);
ACM = (char**)malloc(sizeof(char)*lines);
for(i=0; i<lines; i++)
{
CM[i] = (char*)malloc(sizeof(char)*columns+1);
ACM[i] = (char*)malloc(sizeof(char)*columns);
fscanf(file, "%s", CM[i]);
CM[i] = (char*)realloc(CM[i], sizeof(char)*columns);//don't need \n
printf("%s\n", CM[i]);
}
printf("\n");
for(i=0; i<lines; i++)
{
printf("%s\n", CM[i]);
}
但实际上输出并不是我的预期:
00000
01010
01010
01100
00000
��6
01010
01010
01100
00000
如果我发表评论ACM[i] = (char*)malloc(sizeof(char)*columns);
,那就没有问题。我甚至用GDB来看看发生了什么,我得到了这个:
23 ACM[i] = (char*)malloc(sizeof(char)*columns);
2: CM[0][0] = 48 '0'
3: CM[1][1] = 49 '1'
4: i = 4
(gdb)
24 fscanf(file, "%s", CM[i]);
2: CM[0][0] = -80 '\260'
3: CM[1][1] = 49 '1'
4: i = 4
拜托,有人能告诉我我的代码发生了什么吗?
答案 0 :(得分:3)
malloc(sizeof(char)*lines)
分配足够的内存以保留line
个char
个。您需要足够的内存来保留line
个char*
个。因此,您需要使用sizeof(char*)
代替sizeof(char)
。
CM = (char**)malloc(sizeof(char*)*lines);
ACM = (char**)malloc(sizeof(char*)*lines);
作为良好的编码习惯,请使用:
CM = (char**)malloc(sizeof(*CM)*lines); // CM -> sizeof(*CM)
ACM = (char**)malloc(sizeof(*ACM)*lines); // ACM -> sizeof(*ACM)
这可以防止您遇到的那种错误。
答案 1 :(得分:0)
在
ACM = (char**)malloc(sizeof(char)*lines);
您正在分配行字符,而不是行char * s
答案 2 :(得分:0)
使用char **CM = (char**)malloc(sizeof(char)*lines)
和char **ACM = (char**)malloc(sizeof(char)*lines)
,您可以分配一系列字符,但您应该分配一个指针列表。
改为写char **CM = (char**)malloc(sizeof(char*)*lines)
和char **ACM = (char**)malloc(sizeof(char*)*lines)
。
作为一般规则,返回类型(在您的情况下为char**
)通常比malloc
内的类型多一个星号,即(在您的情况下为char*
)。< / p>
进一步注意,在C中你通常不会转换malloc的结果,而在C ++中你必须强制转换。 BTW:malloc
在C ++中很少使用。