C语言字符串字节数计算问题

clipboard.png

请问大牛,为什么s的字节数是10个,t的字节数是6个啊?不是赋值的时候系统默认加一个'\0'在后面吗?那s的字节数应该是11个啊。

阅读 5.1k
3 个回答

sizeof 不是求字符串长度的。

char s[10] = "abcdeadsir" :
schar[10] ,是一个含有 10 个元素的数组,那么 sizeof(s) 就是 10 ,不管你用什么去初始化它。

注意 sizeof("abcdeadsir") == 11 ,会包含最后的 '\0'

char t[] = "12345"

t 的长度会推断为 6 ,所以 t 的类型是 char[6] ,含有 6 个字符的数组。

C11 draft n1570:

6.7.9 Initialization
14 An array of character type may be initialized by a character string literal or UTF−8 string literal, optionally enclosed in braces. Successive bytes of the string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

用字符串常量初始化数组,如果没有数组里已经没有空间,那么最后的 '\0' 会被丢掉。在上面的初始化之后,s 不是'\0' 结尾的。strlen 一类的函数将不能用于 s

sizeof()输出的内容是char[]的长度, 当指定长度时只输出当前长度,具体求字符串长度还是选择strlen()

#include <stdio.h>

int main()
{

   char s[2] = "123322";
    printf("数组长度%d" , sizeof(s));
    printf("\r\n");
    printf("字符串=%s",s);
        printf("\r\n");
    char t[] = "132";
    printf("字符串长度%d",strlen(s));
    printf("\r\n");
    printf("字符串长度%d",strlen(t) );
    printf("\r\n");
    printf("数组长度%d",sizeof(t) );    
            
   return 0;
}

输出结果

数组长度2
字符串=12
字符串长度2
字符串长度3
数组长度4

s[10] 是一个定长数组,sizeof 运算符获取到 s 的内存大小永远是 10

注:你给定长数组 s[10] 赋值 "abcdeadsir" 的行为,让 s 造成了数组溢出的严重漏洞。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题