我正在为一个程序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("%lun",sizeof(res));
return 0;
}
令人惊讶的是,它输出8 8 8
.谁能解释为什么会这样?为什么默认是8?malloc()
如何影响inp
的大小?
sizeof(inp)
为您提供指针的大小(8 字节,64 位(,而不是该指针下的存储。
您正在使用sizeof
.return size 以字节为单位的类型对象表示形式。请记住 sizeof 是一个运算符。
现在 sizeof 回到这里 8 一种恒定类型的size_t
为什么它没有改变?因为在所有情况下,您都在使用与char *
相同的类型。
这里的 8 个字节是字符指针的大小,即 64 位。
你大概可以看看这个——
printf("size of array of 10 int: %dn" sizeof(int[10]));
这将给出输出:40
. 40 字节。
而且malloc
永远不会影响char*
的大小.它仍然需要 64 位来存储堆中动态分配的空间的地址。
是否可以在 c 中确定动态分配的内存大小?
没有标准的方法可以做到这一点。你必须自己承担这个开销。您可能会找到编译器的一些扩展可以完成此操作。
sizeof(inp)
在您的情况下是sizeof(pointer)
的,因此系统上的sizeof(char-pointer)
是8字节,这是一个常量。在使用malloc()
分配内存时,您会指定大小,那么为什么需要再次获取分配空间的大小呢?
我看到res
正在初始化而不是inp
> ****EDIT**** : 下面的帖子是在编辑问题之前写的。
您最多缺少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)
始终是 1/C
.所以,可以省略那部分。
请阅读:不要在C
中强制转换malloc()
和 family 的返回值。
要点 2:
字符串不应分配给已malloc()
的 ed 指针。 请改用strcpy()
。
inp = "hello world";
应该是
strcpy(inp, "hello world");
否则,您将覆盖以前分配的内存,由 malloc()
返回。分配将覆盖inp
持有的内存位置,从而导致内存泄漏。
第3点。
运算符返回sizeof()
值 size_t
。要打印它,您需要%zu
格式说明符。
相关,摘自C11
标准文件第§7.21.6.1
章第7段,
Z
指定以下 d、i、o、u、x 或 X 转换说明符适用于 size_t或相应的有符号整数类型参数;或者一个 以下 N 转换说明符适用于指向有符号整数类型的指针 对应于size_t参数。
然后,要回答有关输出的查询,在所有情况下,您都会打印sizeof(inp)
它本质上是sizeof(char *)
的,并且该值对于特定平台是固定的(在您的情况下8
(。
仅供参考,sizeof()
是一个运算符,它不是一个函数。它返回数据类型的大小,而不是变量指向的空间量。