与malloc的奇怪问题

时间:2018-01-17 21:58:28

标签: c++ c memory malloc

我正在做一个简单的代码来打开带有矩阵的文件,但是我遇到了一个奇怪的错误。这是我的代码:

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

拜托,有人能告诉我我的代码发生了什么吗?

3 个答案:

答案 0 :(得分:3)

malloc(sizeof(char)*lines)分配足够的内存以保留linechar个。您需要足够的内存来保留linechar*个。因此,您需要使用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 ++中很少使用。