为什么这些循环增量如此奇怪?

3
#include <stdio.h>
#include <stdlib.h>

    int main(){

        int rows, col, i, j;
        char **mazeArrP;

        scanf("%d %d", &rows, &col);

        mazeArrP = (char **) malloc(rows*sizeof(char));

        for(i = 0; i<rows; i++){

            printf("i = %d\n", i);
            mazeArrP[i] = (char *) malloc(col*sizeof(char));

            for(j = 0; j<col; j++){

                printf("j = %d\n", j);
                scanf("%c", &mazeArrP[i][j]);
            }
        }

        return 0;
    }

我使用print命令来确定我在循环中的位置。我正在尝试创建一个简单的二维字符数组,但我的循环表现得很奇怪。这是我第一次尝试使用双指针来创建一个二维数组,所以任何在这方面的帮助都将不胜感激。它似乎是从0,0开始到0,1然后要求进行扫描,然后跳到i=1 j=0等等。我是否漏掉了某些基本的东西?

2个回答

7
mazeArrP = (char **) malloc(rows*sizeof(char));

是错误的。请更改为


mazeArrP = malloc(rows * sizeof(*mazeArrP));

此外,“the line”这一句话。
mazeArrP[i] = (char *) malloc(col*sizeof(char));

可以写成:
mazeArrP[i] = malloc(col);

sizeof(char) 的值为1,因此它是多余的。


3
不要释放 malloc 函数的返回值。 - P0W
1
@P0W 是的,我会提到的。谢谢。 - digital_revenant
3
sizeof(*mazeArrP) 更好,因为即使更改了 mazeArrP 的类型,它也是正确的。 - digital_revenant
2
@haccks 点此查看,你就会知道。 - Gangadhar
1
@Gangadhar:不错。谢谢分享链接。 - haccks
谢谢您提供的malloc信息! - RJones

4
除了malloc问题之外,
你的循环表现得“奇怪”,因为前一个scanf的尾随换行符被视为新输入。
因此,请使用:
int c;
while((c=getchar())!='\n' && c!=EOF) ; //to remove newlines from previous scanf

scanf 之后


1
只需将 scanf("%c", &mazeArrP[i][j]); 更改为 scanf(" %c", &mazeArrP[i][j]); 即可。因为在 %c 前添加空格就像使用 fflush(); 一样。 - Vedant Terkar
我最初没有任何打印或换行,但是添加了它们,因为循环只会扫描4个字符而不是6个。当我完全删除打印命令时,它仍然只扫描4个字符并且增量奇怪。 - RJones
@VedantTerkar;这是P0W最喜欢的一句话之一。他在这里用过很多次。 :) - haccks
@RJones 很高兴我的评论对你有用。 - Vedant Terkar
@VedantTerkar 感谢你和 P0W! - RJones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接