我将相同的字符串值分配给指针和
char
数组
char *str = "hello" "world";
char str1[] = "hello" "world";
然后使用
sizeof()
函数返回它们的长度
sizeof(str); // on my computer, it's 8 !!
sizeof(str1); // return 11, which is right
但是两者都可以直接打印出来
%s
:
printf("%s\n%s\n", str, str1);
那么为什么
sizeof(str);
返回错误的值?
那么为什么 sizeof(str); 返回错误的值?
它不会,因为
sizeof
返回其操作数类型的大小(以字节为单位)。来自 C99 标准(草案 n869)第 6.5.3.4 操作符的 size,第 2 条:
运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或带括号的类型名称。大小由操作数的类型决定。 结果是一个整数。如果操作数的类型是变长数组类型,则对操作数求值;否则,不计算操作数并且结果是整型常量。sizeof
因此:
sizeof(str) == sizeof(char*)
sizeof(str1) == sizeof(char[11])
第一个是指针。您不计算字符数,而是计算内存中指针的大小。您需要了解其中的差异。
char*
指向内存中您假设包含连续字符的位置。 char[x]
是内存中的一个位置,其中一行有 x 个字符。
值 8 是指针的大小,因为 str 实际上是一个指针,就像它看起来一样,即您可以重新分配它以指向另一个字符串文字。
变量str1是一个字符数组,因此不能重新赋值,其大小与数组的大小有关。
str*
是指针类型,str[]
是char[11]类型。因此, sizeof()
将返回不同的值,它返回类型的大小,而不是字符串的长度。
您应该使用
strlen()
来检查字符串的大小。请记住,您使用 strlen()
测试的每个字符串都必须以终止 null ( ) 结尾。
对于常量(使用“lorem ipsum”在代码中定义),编译器会添加终止 null。
C 编程语言本身对字符串的唯一支持是编译器会将带引号的字符串常量翻译为以 null 结尾的字符串,该字符串存储在静态内存中。
第一个是指向字符的指针,另一个是数组。 指针仅指向一个字符,大小为一字节。
您可以使用 char* 作为数组,但您需要知道单独变量中的计数。
char *ss = "hello";
char sa[6] = "hello\0";
char sc[6] = {'h','e','l','l','o',0x0};
printf("mem: %p ",ss);
printf("mem: %p ",sa);
printf("mem: %p ",sc);
printf("size: %d ",sizeof(ss));
printf("size: %d ",sizeof(sa));
printf("size: %d ",sizeof(sc));
printf("size: %x ",sizeof(&ss));
printf("size: %x ",sizeof(&sa));
printf("size: %x ",sizeof(&sc));
printf("ptr: %d ",sizeof(void*));
printf("chr: %d ",sizeof(char));
printf("int: %d ",sizeof(int));
printf("\r\n");
这将显示
sizeof
运算符返回意外结果的一些情况。 sizeof
运算符返回大小(以字节为单位)。