【发布时间】:2016-11-20 12:54:28
【问题描述】:
我有一个两部分的问题:
- 了解
sizeof的输出 - 了解字符串如何存储在变量中(例如位和内存)
问题 1
我正在尝试理解以下 C 代码的输出。
printf("a: %ld\n", sizeof("a")); // 2
printf("abc: %ld\n", sizeof("abc")); // 4
它似乎总是比指定的实际字符数大一。
文档建议返回值表示对象(在本例中为字符串)的大小(以字节为单位)。所以如果a 的大小给我们返回2 字节,那么我很好奇a 是如何表示16 位信息的。
如果我查看 ASCII 字符 a 的二进制表示,我可以看到它是 01100001。但这仅显示使用了 1 个字节中的 3 位。
问题 2
另外,大字符串如何存储到 C 中的变量中?我是否认为它们必须存储在数组中,如下所示:
char my_string[5] = "hello";
有趣的是,当我有一些代码时:
char my_string = "hello";
printf("my_string: %s\n", my_string);
我得到两个编译器错误:
- incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [6]'
- format specifies type 'char *' but the argument has type 'char'
...我不明白。首先它声明当只有 5 个字符时,类型被假定为[6] 的大小。其次,这里提到的指针对我来说似乎很奇怪?为什么printf 需要一个指针,为什么不指定变量/数组的长度会导致指针指向整数错误?
顺便说一句,我似乎可以将变量/数组的长度设置为 5 而不是 6,它会像我期望的那样工作 char my_string[5] = "hello";。
我可能只是遗漏了一些关于位和字符串如何在 C 中工作的非常基本的/基础知识。
任何理解这一点的帮助将不胜感激。
【问题讨论】:
-
sizeof 返回一个 size_t,也就是 uintmax_t。阅读this 了解好标志。 C 中的字符串以 '\0' 结尾,所以 "a" == {'a', '\0'} 所以两个字符。
char my_string[5] = "hello";无效,您没有空间用于 '\0'。 -
发布两个单独的问题。
-
@Stargateur:
size_t不是uintmax_t的同义词。例如,在许多 32 位平台上,size_t是 32 位的,但uintmax_t可能表示 64 位整数 (unsigned long long)。 -
@dreamlax 不,uintmax_t 是实现的最大整数提供程序。所以在 32 位中,uintmax_t => uint32_t。 doc。 size_t 的目的是处理一个大小,因此是一个无符号整数。 uintmax_t 完美地代表了这一点。
-
char my_string[5] = "hello";可能会导致缓冲区溢出。正如@JohnBode 指出他的answer,让编译器弄清楚数组的大小应该是多少。
标签: c arrays string sizeof bits