当前位置: 代码迷 >> C语言 >> 对于字符串'\0'字符的疑义
  详细解决方案

对于字符串'\0'字符的疑义

热度:6007   发布时间:2013-02-26 00:00:00.0
对于字符串'\0'字符的疑问
本帖最后由 CppOrJava 于 2013-02-03 16:15:24 编辑
我写了一段输出 "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
------解决方案--------------------------------------------------------
引用:
巧合
不过大多数情况linux下没使用的空间位模式都是0


巧合

------解决方案--------------------------------------------------------
巧合。在程序中输出temp[15],但在你的程序中并没有给temp[15]赋值,因此该值是系统给赋的不确定的值。巧合的是该值刚好是'\000'。
------解决方案--------------------------------------------------------
这里没有指明数组的大小,所以是巧合。
如果有明确指明数组的大小,就不一定是巧合了,因为大多数编译器都会给没有明确初始化的元素赋0值。
  相关解决方案