C 为什么它总是说我的动态数组的容量是2,尽管我一直在更改它,所以它不是2?
我想打印出动态数组的容量,但无论我如何更改它,它总是说两个数组的容量都是2 代码(tmp.c) 终端的输出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)不产生指针指向的有效内存大小,它返回指针本身的大小
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