sizeof与string的行为

时间:2014-03-30 20:29:46

标签: c string sizeof

‪#‎include‬ <stdio.h>
#include <string.h>
int main()
{
    printf("%d\n",sizeof("S\065AB"));
    printf("%d\n",sizeof("S65AB"));
    printf("%d\n",sizeof("S\065\0AB"));
    printf("%d\n",sizeof("S\06\05\0AB"));
    printf("%d\n",sizeof("S6\05AB"));
    printf("%d\n",sizeof("\0S65AB"));
    return 0;
}

输出:

5
6
6
7
6
7

http://ideone.com/kw23IV

任何人都可以用字符串解释这种行为吗?

在Debian 7.4上使用GCC

2 个答案:

答案 0 :(得分:5)

字符串文字的大小是其中的字符数,包括添加的尾随空字节。如果字符串中存在嵌入的空值,则它们并不重要;他们被计算在内。它与strlen()无关,只是如果文字不包含嵌入的空值strlen(s) == sizeof(s) - 1

printf("%zu\n", sizeof("S\065AB"));      // 5: '\065' is a single character
printf("%zu\n", sizeof("S65AB"));        // 6
printf("%zu\n", sizeof("S\065\0AB"));    // 6: '\065' is a single character
printf("%zu\n", sizeof("S\06\05\0AB"));  // 7: '\06' and '\05' are single chars
printf("%zu\n", sizeof("S6\05AB"));      // 6: '\05' is a single character
printf("%zu\n", sizeof("\0S65AB"));      // 7

请注意'\377'是一个有效的八进制常量,相当于'\xFF'或255.您也可以在字符串中使用它们。值'\0'只是更一般的八进制常量的特例。

请注意,sizeof()的计算结果为size_t类型的值,C99和C11中size_t的正确格式类型限定符为z,因为它是无符号的,ud更合适,因此我使用的是"%zu\n"格式。

答案 1 :(得分:2)

文字字符串是一个数组,其大小与保存所有字符所需的大​​小完全相同,并且是一个额外的终止零字节。

因此,"hello"的类型为char[6]sizeof的格式为6。