在一个小项目上工作,我正在尝试制作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”提供建议吗?
答案 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
但是再说一次-由于这实际上是未定义的行为,所以这只是猜测。什么都可能发生。