我的程序崩溃了以下几行:
警告:HEAP [maze.exe]: 警告:00392F30处的堆块在00392F3B处修改过去请求的大小为3
我正在为字符串动态分配空间
int userReq() {
char **maze=NULL;
char *pchar;
int i, test_cases, cur_test=0;
int row, col;
/* gather the amount of test cases */
scanf("%d", &test_cases);
do{
scanf("%d",&row);
scanf("%d",&col);
/* allocate memory for char pointer row-wise */
maze = (char **) malloc(row*sizeof(char*));
for(i=0;i<row;i++)
/* for each cell allocate the num of chars in cell */
maze[i] = (char *) malloc(col*sizeof(char));
for(i=0;i<row;i++)
scanf("%s",maze[i]);
/* this function does modify the maze by changing some of the spots to a different char */
CallSomeFunctionHere(maze);
/* free first the cells then the entire block */
for(i=0;i<row;i++)
free(maze[i]);
free(maze);
cur_test = cur_test + 1;
}while(cur_test < test_cases);
/* if we were successful then exit program with
success */
return 0;
}
我的程序在执行逻辑然后尝试释放内存后崩溃。
答案 0 :(得分:3)
这意味着您请求的内存少于您需要的内存。最可能的罪魁祸首是这一行:
maze[i] = (char *) malloc(col*sizeof(char));
由于您将maze[i]
作为scanf
目标传递给%s
,因此您需要为空终结符分配额外的char
。
将输入限制为已分配的内容是一个非常好的主意。请考虑使用fgets
代替scanf
:
for(i=0;i<row;i++)
fgets(maze[i], col+1, stdin);
P.S。在C中,您不需要投射malloc
。您也不需要乘以sizeof(char)
,因为标准要求它为1
。
maze[i] = malloc(col+1);
答案 1 :(得分:1)
maze[i] = (char *) malloc(col*sizeof(char));
您没有为字符串终止符分配空间。改为:
maze[i] = malloc(col + 1);
请注意,根据定义,sizeof(char)
为1,您无需对malloc
的返回值进行类型转换。
有两个地方可以让缓冲区溢出:
scanf("%s",maze[i]);
更改为:
scanf("%.*s", col, maze[i]);
最后一个地方是:
CallSomeFunctionHere(maze);
(我没有这个的源代码。)
答案 2 :(得分:0)
您忘记为字符串中的尾随空分配空间:
maze[i] = malloc((col+1)*sizeof(char));