0

我的程序因以下几行而崩溃:

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

}

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

4

3 回答 3

3

这意味着您请求的内存比您需要的少。最可能的罪魁祸首是这一行:

maze[i] = (char *) malloc(col*sizeof(char));

由于您是作为目标传递的maze[i],因此您需要为空终止符分配额外的。scanf%schar

将输入限制为您分配的内容是一个非常好的主意。考虑使用fgets而不是scanf

for(i=0;i<row;i++) 
    fgets(maze[i], col+1, stdin);

PS 在 C 中,您不需要强制转换malloc. 你也不需要乘以sizeof(char),因为标准要求它是1

maze[i] = malloc(col+1);
于 2013-10-25T10:47:39.880 回答
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);

(我没有这个的源代码。)

于 2013-10-25T10:49:52.873 回答
0

您忘记为字符串中的尾随 null 分配空间:

maze[i] = malloc((col+1)*sizeof(char));
于 2013-10-25T10:46:19.897 回答