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

时间:2015-04-01 12:59:13

标签: c arrays malloc sizeof dynamic-arrays

我得到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的大小?

4 个答案:

答案 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位来存储来自堆的动态分配空间的地址。

是否可以确定c?

中动态分配的内存的大小

没有标准方法来执行此操作。你必须自己承担这个开销。您可能会发现编译器的一些扩展可能会实现此目的。

答案 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 ,而不是变量指向的空间量。