C中的NUL字符和静态字符数组/字符串文字

时间:2017-04-13 04:19:28

标签: c arrays char

我理解字符串是由C中的NUL '\0'字节终止的。 但是,我无法弄清楚为什么字符串文字中的0与堆栈中创建的字符数组中的0的行为不同。在文字中检查NUL终止符时,数组中间的零不会被视为这样。

例如:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>

int main()
{

    /* here, one would expect strlen to evaluate to 2 */
    char *confusion = "11001";
    size_t len = strlen(confusion);
    printf("length = %zu\n", len); /* why is this == 5, as opposed to 2? */



    /* why is the entire segment printed here, instead of the first two bytes?*/
    char *p = confusion;
    while (*p != '\0')
        putchar(*p++);
    putchar('\n');



    /* this evaluates to true ... OK */
    if ((char)0 == '\0')
        printf("is null\n");


    /* and if we do this ... */
    char s[6];
    s[0] = 1;
    s[1] = 1;
    s[2] = 0;
    s[3] = 0;
    s[4] = 1;
    s[5] = '\0';

    len = strlen(s); /* len == 2, as expected. */
    printf("length = %zu\n", len);

    return 0;
}

输出:

 length = 5
 11001
 is null
 length = 2

为什么会这样?

3 个答案:

答案 0 :(得分:1)

变量'confusion'是指向文字字符串的char的指针。 所以内存看起来像

is age in {young, medium}?

因此,当您打印变量'confusion'时,它将打印所有内容,直到第一个空字符由\ 0表示。
11001中的零不为空,它们是字面零,因为它被双引号括起来。

但是,在变量's'的char数组赋值中,您将分配一个十进制值0 char变量。执行此操作时,将为ASCII字符值为NULL字符的ASCII十进制值0分配给它。所以字符数组看起来像在内存中

 [11001\0]

ASCII字符happyface的ASCII十进制值为1。 因此,当您打印时,它会将所有内容打印到第一个NULL,从而打印出来 strlen是2。

这里的技巧是了解在为其分配十进制值时真正分配给字符变量的内容。

试试这段代码:

  [happyface, happyface, NULL]

}

答案 1 :(得分:0)

&#39; 0&#39;和0不是相同的值。 (第一个是48,通常,虽然从技术上来说,精确值是实现定义的,但是写48以引用字符&#39; 0&#39;被认为是非常糟糕的风格。)

如果&#39; 0&#39;终止了一个字符串,你就不能在字符串中加零,这有点......限制。

答案 2 :(得分:0)

您可以查看ASCII表格(例如http://www.asciitable.com/)以检查字符&#39; 0&#39;的确切值。和null