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 中动态分配内存的大小?
没有标准方法可以做到这一点。你必须自己承担这个开销。您可能会发现一些编译器扩展可以实现这一点。
我正在为一个程序获得 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 中动态分配内存的大小?
没有标准方法可以做到这一点。你必须自己承担这个开销。您可能会发现一些编译器扩展可以实现这一点。