我写了一段输出 "Happy New Year!" 的程序.
#include <stdio.h>
#include <string.h>
void swap_char(char *p1, char *p2)
{
char temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void ch_str1(char *p)
{
int i, j;
for (i = 0, j = strlen(p) - 1; i < j; i += 1, j -= 1)
{
swap_char(p + i, p + j);
}
}
int main(void)
{
char temp[] =
{
0x21, 0x71, 0x5f,
0x62, 0x55, 0x1b,
0x71, 0x5e, 0x46,
0x17, 0x6f, 0x65,
0x64, 0x54, 0x3a,
'\0'
};
int i;
for (i = 0; i < strlen(temp); i += 1)
{
*(temp + i) += i;
}
ch_str1(temp);
printf("%s\n", temp);
return 0;
}
原先, 我没有写程序的第 33 行, 使用 GCC 编译后, 输出结果为 "Happy New Year!".
使用 GDB 调试,
$ b 48
$ print temp[15]
显示 temp[15] = '\000'
原先没有 33 行时, 数组的长度应为 15, 即数组的下标到 14 为止, 但 temp[15] 却为 '\000'
添加 33 行后, 输出结果同样.
请问, 原先程序的 temp[15] 的值是巧合还是另有玄机?
求解.
环境: Ubuntu 12.04 GCC 4.63
------解决方案--------------------------------------------------------
巧合
不过大多数情况linux下没使用的空间位模式都是0
------解决方案--------------------------------------------------------
巧合
------解决方案--------------------------------------------------------
巧合。在程序中输出temp[15],但在你的程序中并没有给temp[15]赋值,因此该值是系统给赋的不确定的值。巧合的是该值刚好是'\000'。
------解决方案--------------------------------------------------------
这里没有指明数组的大小,所以是巧合。
如果有明确指明数组的大小,就不一定是巧合了,因为大多数编译器都会给没有明确初始化的元素赋0值。