在C中分配2D char Matrix的奇数输出

时间:2018-10-14 07:38:53

标签: c matrix char adjacency-matrix

在一个小项目上工作,我正在尝试制作2D字符数组。我以前用int完成此操作,并尝试结束该示例,但似乎遇到了一个我不理解的问题。

这就是我的做法:

adjMatrix = (char **) malloc(sizeof(char *) * dimensions);

for (int i = 0; i < dimensions; i++)
    adjMatrix[i] = (char *) malloc(sizeof(char) * (dimensions + 2));

for (int i = 0; i < dimensions; i++)
    for (int j = 0; j < (dimensions + 2); j++)
        adjMatrix[i][j] = '0';

这是我的显示功能:

    for (int i = 0; i < dimensions; i++)
    {
        for (int j = 0; j < (dimensions + 2); j++)
            printf("%s ", &(adjMatrix[i][j]));

        printf("\n");
    }

这是我的输出

000000 00000 0000 000 00 0 
000000 00000 0000 000 00 0 
000000 00000 0000 000 00 0 
000000 00000 0000 000 00 0 

任何人都可以向我解释为什么它会以这种方式显示,并就如何在每个插槽中将其设置为单个“ 0”提供建议吗?

2 个答案:

答案 0 :(得分:0)

  

任何人都可以向我解释为什么它会以这种方式显示,并就如何在每个插槽中将其设置为单个“ 0”提供建议吗?

这是因为建议您打印一个字符串而不是一个字符。

将代码更改为:

printf("%c ", adjMatrix[i][j]);

请注意,adjMatrix[i]指向单个字符的数组,而字符数组是一个字符串。此外,这是未定义的行为,因为您没有0终止“字符串”。

&adjMatrix[i][0]是指向'0' '0' '0' '0' '0' '0'的指针,
&adjMatrix[i][1]'0' '0' '0' '0' '0'的指针,
&adjMatrix[i][2]'0' '0' '0' '0'的指针,
...

答案 1 :(得分:0)

  

任何人都可以向我解释为什么这样显示

简短的答案是“未定义的行为”,因为

1)您尝试使用%s(不是字符串,即包含零终止'\0'的char数组)打印不是不是字符串的内容。

2)您越界读取,因为带有%s的printf将继续读取,直到看到字符串终止为止。

由于不确定的行为,可以说猜测正在发生的事情是没有意义的。

如果我们仍然这样做,则可能类似于:

您使用6列并将它们初始化为'0',以便内存为

 '0' '0' '0' '0' '0' '0'

,我们无法判断最后一个'0'之后是什么。靠“运气”,似乎下一个存储位置恰好容纳了字符串终止符。喜欢:

 '0' '0' '0' '0' '0' '0' '\0'
                          ^^
                          A guess...

现在,您可以使用%s(并添加一个空格)将其打印为字符串。

第一次将指针传递到第一个“ 0”。

 '0' '0' '0' '0' '0' '0' '\0'
  ^
  pointer

因此它将为您打印6'0'(和空格)。

然后将指针移至右侧,然后再次调用printf

 '0' '0' '0' '0' '0' '0' '\0'
      ^
      pointer

所以它将给您打印5'0'

接下来的循环将给出4'0',然后是3,然后是2,然后是1,最后得到

000000 00000 0000 000 00 0

但是再说一次-由于这实际上是未定义的行为,所以这只是猜测。什么都可能发生。