C 为什么它总是说我的动态数组的容量是2,尽管我一直在更改它,所以它不是2?

C 为什么它总是说我的动态数组的容量是2,尽管我一直在更改它,所以它不是2?,c,malloc,dynamic-memory-allocation,sizeof,C,Malloc,Dynamic Memory Allocation,Sizeof,我想打印出动态数组的容量,但无论我如何更改它,它总是说两个数组的容量都是2 代码(tmp.c) 终端的输出 gcc -std=c99 tmp.c -o tmp ./tmp capacity of ptr1 is: 2 capacity of ptr2 is: 2 无论我为malloc()和realloc()输入什么容量参数,我都会得到这个输出。两件事: 无论如何,您没有检查分配内存的大小 详细说明一下,这里的问题是,sizeof(ptr1)不产生指针指向的有效内存大小,它返回指针本身的大小

我想打印出动态数组的容量,但无论我如何更改它,它总是说两个数组的容量都是2

代码(tmp.c)

终端的输出

gcc -std=c99 tmp.c -o tmp
./tmp
capacity of ptr1 is: 2
capacity of ptr2 is: 2
无论我为malloc()和realloc()输入什么容量参数,我都会得到这个输出。

两件事:

  • 无论如何,您没有检查分配内存的大小
  • 详细说明一下,这里的问题是,
    sizeof(ptr1)
    不产生指针指向的有效内存大小,它返回指针本身的大小。指针(或任何类型的指针)的大小是常量

    对于分配器函数返回的指针,有一种直接的方法可以从指针本身获取请求(和分配)内存大小,您需要自己跟踪大小


    也就是说:

    取指针(不是数组)的大小,通常是64位,然后除以int的大小,通常是32位。这就是为什么结果是2

    sizeof(ptr2)
    不会提供所分配内存的容量。它给你的只是
    int
    指针的大小,它保持不变。
    sizeof
    指针是实际指针的大小,而不是它可能指向的。在C中执行动态分配时,您必须自己跟踪“大小”。
    sizeof array/sizeof*array
    仅适用于数组,并且仅在声明数组的范围内
    int*ptr1
    声明一个指针,因此
    sizeof ptr1
    sizeof(a_指针)
    (x86_64上通常为8字节)和
    sizeof(int)
    4
    。无论您为
    sizeof ptr1/sizeof(int)
    分配了多少
    int
    ,在x86_64上的方式都是
    2
    。使用搜索引擎。它是最常见的副本之一
    capacity of ptr1 is: 2
    capacity of ptr2 is: 2