HEAP大小错误字符串

时间:2013-10-25 10:39:20

标签: c

我的程序崩溃了以下几行:

警告: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;

}

我的程序在执行逻辑然后尝试释放内存后崩溃。

3 个答案:

答案 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));