我得到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
的大小?
答案 0 :(得分:4)
sizeof(inp)
给出指针的大小(8字节,64位),而不是指针下的存储。
答案 1 :(得分:1)
您正在使用sizeof
。返回类型的对象表示的字节数。记住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位来存储来自堆的动态分配空间的地址。
没有标准方法来执行此操作。你必须自己承担这个开销。您可能会发现编译器的一些扩展可能会实现此目的。
答案 2 :(得分:0)
sizeof(inp)
为sizeof(pointer)
,因此系统上的sizeof(char-pointer)
为8个字节,这是一个常量。使用malloc()
分配内存时,您可以指定大小,那么为什么需要再次获取分配空间的大小?
我看到res
正在初始化,而不是inp
答案 3 :(得分:-1)
****编辑**** :以下帖子是在问题的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 *
s。然后,您应该写sizeof(char)
,而不是sizeof(char *)
。此外,sizeof(char)
中的C
始终为1。所以,可以省略那部分。
请在malloc()
中阅读do not cast C
和家人的返回值。
第2点:
字符串不应该分配到已经malloc()
的指针。请改用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转换说明符适用于a size_t或相应的有符号整数类型参数;或者那个 以下n转换说明符适用于指向有符号整数类型的指针 对应于size_t参数。
然后,要回答有关输出的查询,在所有情况下,您都打印的sizeof(inp)
基本上是sizeof(char *)
,并且该值已针对特定平台(8
,在你的情况下)。
仅供参考,sizeof()
是一个运营商,它不是一个功能。它返回数据类型的 size ,而不是变量指向的空间量。