在 C 中分配二维字符矩阵的奇数输出
Odd output allocating 2D char Matrix in C
我正在做一个小项目,我正在尝试制作一个二维字符数组。我以前用整数做过,并试图摆脱那个例子,但似乎我 运行 陷入了一个我不明白的问题。
我就是这样做的:
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”提供任何建议吗?
Could anyone explain to me why it's showing that way and give any advice as to how to make it just a single '0' in each slot?
这是因为您建议打印一个字符串而不是单个字符。
将您的代码更改为:
printf("%c ", adjMatrix[i][j]);
注意,adjMatrix[i]
指向单个字符数组,字符数组就是字符串。此外,这是未定义的行为,因为您没有 0 终止 "string"。
&adjMatrix[i][0]
是指向 '0' '0' '0' '0' '0' '0'
,
的指针
&adjMatrix[i][1]
是指向 '0' '0' '0' '0' '0'
,
的指针
&adjMatrix[i][2]
是指向 '0' '0' '0' '0'
,
的指针
...
Could anyone explain to me why it's showing that way
简短的回答是 "undefined behavior" 因为
1) 您尝试使用 %s
打印 而不是 的字符串(这需要一个字符串,即包含零终止符 '[ =16=]'
).
2) 您读取越界,因为带有 %s 的 printf 将继续读取,直到它看到一个字符串终止。
由于未定义的行为,可以说猜测正在发生的事情是没有意义的。
如果我们仍然这样做,它可能是这样的:
您使用 6 列并将它们初始化为“0”,这样内存为
'0' '0' '0' '0' '0' '0'
而且我们无法判断最后一个“0”之后是什么。通过 "luck" 似乎下一个内存位置恰好包含一个字符串终止符。喜欢:
'0' '0' '0' '0' '0' '0' '[=11=]'
^^
A guess...
现在使用 %s
(并添加 space)将其打印为字符串。
第一次将指针传递给第一个“0”。
'0' '0' '0' '0' '0' '0' '[=12=]'
^
pointer
所以它会给你一个 6 '0'(和 space)的打印。
然后你将指针向右移动,再次调用printf
'0' '0' '0' '0' '0' '0' '[=13=]'
^
pointer
所以它会打印出 5 '0'
下一个循环将给出 4 个“0”,然后是 3,然后是 2,然后是 1,最后得到
000000 00000 0000 000 00 0
但同样 - 因为它确实是未定义的行为,所以这只是猜测。任何事情都可能发生。
我正在做一个小项目,我正在尝试制作一个二维字符数组。我以前用整数做过,并试图摆脱那个例子,但似乎我 运行 陷入了一个我不明白的问题。
我就是这样做的:
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”提供任何建议吗?
Could anyone explain to me why it's showing that way and give any advice as to how to make it just a single '0' in each slot?
这是因为您建议打印一个字符串而不是单个字符。
将您的代码更改为:
printf("%c ", adjMatrix[i][j]);
注意,adjMatrix[i]
指向单个字符数组,字符数组就是字符串。此外,这是未定义的行为,因为您没有 0 终止 "string"。
&adjMatrix[i][0]
是指向 '0' '0' '0' '0' '0' '0'
,
的指针
&adjMatrix[i][1]
是指向 '0' '0' '0' '0' '0'
,
的指针
&adjMatrix[i][2]
是指向 '0' '0' '0' '0'
,
的指针
...
Could anyone explain to me why it's showing that way
简短的回答是 "undefined behavior" 因为
1) 您尝试使用 %s
打印 而不是 的字符串(这需要一个字符串,即包含零终止符 '[ =16=]'
).
2) 您读取越界,因为带有 %s 的 printf 将继续读取,直到它看到一个字符串终止。
由于未定义的行为,可以说猜测正在发生的事情是没有意义的。
如果我们仍然这样做,它可能是这样的:
您使用 6 列并将它们初始化为“0”,这样内存为
'0' '0' '0' '0' '0' '0'
而且我们无法判断最后一个“0”之后是什么。通过 "luck" 似乎下一个内存位置恰好包含一个字符串终止符。喜欢:
'0' '0' '0' '0' '0' '0' '[=11=]'
^^
A guess...
现在使用 %s
(并添加 space)将其打印为字符串。
第一次将指针传递给第一个“0”。
'0' '0' '0' '0' '0' '0' '[=12=]'
^
pointer
所以它会给你一个 6 '0'(和 space)的打印。
然后你将指针向右移动,再次调用printf
'0' '0' '0' '0' '0' '0' '[=13=]'
^
pointer
所以它会打印出 5 '0'
下一个循环将给出 4 个“0”,然后是 3,然后是 2,然后是 1,最后得到
000000 00000 0000 000 00 0
但同样 - 因为它确实是未定义的行为,所以这只是猜测。任何事情都可能发生。