c - 为什么 str[5]、str[] = "1234"和 str = malloc(5) 有不同的大小?

标签 c arrays pointers sizeof

请考虑以下声明:

char str1[5];
char str2[] = "1234";
char *str3 = malloc(sizeof(char) * 5);

每个str的大小被打印:

printf("str1 has size %ld\n", sizeof(str1));
printf("str2 has size %ld\n", sizeof(str2));
printf("str3 has size %ld\n", sizeof(str3));

输出是:

str1 has size 5
str2 has size 5
str3 has size 8

我了解到指针的大小是 8 个字节。在这 3 种情况下,str是一个指针,*str对应字符串的第一个字符str : 在这3种情况下,它的大小都是1个字节,也就是一个char的大小.

如果我让程序分配 5 个字节的内存给 strchar str[] = "1234"char str[5]; , 大小为 str是5个字节。但是当我为 char *str 分配 5 个字节时与 malloc , 大小为 str还是8个字节,也就是一个指针的大小。我期望大小为 str3对应于我分配给它的内存量 malloc .

为什么我错了?

最佳答案

长话短说——Arrays are not pointers and vice-versa

在您的代码中,str1str2“数组”,而str3 “指针”。它们的尺寸是根据它们各自的类型打印的。

  • str1 根据定义有 5 个 char 元素。
  • str2 也有 5 个 char 元素,初始值设定项 + 空终止符。
  • str3 是一个指针,所以 sizeof(str3) === sizeof(char *) [注意:这取决于在您的环境中,它不是固定的,最常见的值为 8(64 位 rach)和 4(32 位 arch)]

FWIW,使用 %zu 打印 sizeof 运算符的输出,因为它是 size_t 类型。

关于c - 为什么 str[5]、str[] = "1234"和 str = malloc(5) 有不同的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44631017/

相关文章:

c - 如何在 20 秒后终止 c 程序

arrays - MongoDB展开多个数组

java - Java 中的集合排序

c - C中字符串数组的数组

c - 在下面的代码中,*ptr 如何与 (.) 一起使用以及 (&test) 与 -> 一起使用?

c++ - strcmpi 重命名为 _strcmpi?

c - 无法正常工作。我缺少什么?

c - Chez Scheme 中的 FFI,用于具有可变参数的 C 函数(varargs)

C:应用于数组与指针的&符号运算符

c++ - 分配空间中的链表?