C中动态数组的大小不会改变

Size of dynamic array in C doesn't change

我正在为一个程序获得 realloc(): invalid next size。所以我只是对此进行编码以了解发生了什么。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char *inp;
    printf("%lu ",sizeof(inp));
    char *res = (char*)malloc(15*sizeof(char*));
    printf("%lu ",sizeof(res));
    res = "hello world";
    printf("%lu\n",sizeof(res));
    return 0;
}

令人惊讶的是它输出 8 8 8。谁能解释为什么会这样?为什么默认是8? malloc() 如何影响 inp 的大小?

****编辑**** :下面的post写在[=38=之前] 的问题。

您最多缺少 stdlib.h,函数 malloc() 无法正常工作。之后,

第 1 点:

char *res = (char*)malloc(15*sizeof(char*));

应该是

char *res = malloc(15);   //will also issue warning to resolve missing stdlib.h

注意事项:您应该为 char 分配内存,而不是 char *。那么,你应该写sizeof(char),而不是sizeof(char *)。此外,sizeof(char)C 中始终为 1。所以,可以省略那部分。

请阅读:do not castmalloc()和家人在C中的return价值。

第 2 点:

字符串不应该分配给已经malloc()ed的指针。请改用 strcpy()

 inp = "hello world";

应该是

strcpy(inp, "hello world");

否则,您将覆盖之前分配的内存,return由 malloc() 编辑。 赋值会覆盖inp持有的内存位置,导致内存泄漏。

点 3.

sizeof() 运算符 return 的值为 size_t。要打印它,您需要 %zu 格式说明符。

相关,来自 C11 标准文档,第 §7.21.6.1 章,第 7 段,

z

Specifies that a following d, i, o, u, x, or X conversion specifier applies to a size_t or the corresponding signed integer type argument; or that a following n conversion specifier applies to a pointer to a signed integer type corresponding to size_t argument.


然后,为了回答有关输出的查询,在所有情况下,您都在打印 sizeof(inp),它本质上是 sizeof(char *),并且该值对于特定平台是固定的(8,在你的情况下)。

仅供参考,sizeof() 是运算符,不是函数。它 return 是数据类型的 大小 ,而不是变量 .[=40 指向的 space 的 数量=]

sizeof(inp) 给出指针的大小(8 字节,64 位),而不是该指针下的存储空间。

sizeof(inp) 在你的情况下是 sizeof(pointer) 因此 sizeof(char-pointer) 在你的系统上是 8 个字节,这是一个常量。在使用 malloc() 分配内存时,您已经指定了大小,那么为什么您需要再次获取已分配的 space 的大小?

我看到 res 正在初始化,而不是 inp

您正在使用 sizeof.returns 类型对象表示的大小(以字节为单位)。记住 sizeof 是一个运算符。

现在 sizeof 在这里返回 8 常量类型 size_t

为什么它没有改变? 因为在所有情况下你都使用相同的类型 char *.

这里8个字节是64位字符指针的大小

你或许可以看看这个-

printf("size of array of 10 int: %d\n" sizeof(int[10]));

这将给出输出:40。 40 个字节。

malloc永远不会影响char*的大小。它仍然需要 64 位来存储堆中动态分配的 space 的地址。

是否可以确定 c 中动态分配内存的大小?

没有标准方法可以做到这一点。你必须自己承担这个开销。您可能会发现一些编译器扩展可以实现这一点。