C动态内存分配和sizeof()

mik*_*ike 1 c memory

我在理解这两个代码段之间的区别时遇到了一些麻烦:我使用以下语句在代码中动态地为整数数组分配空间

int *arr = calloc(cnt, sizeof(int));
Run Code Online (Sandbox Code Playgroud)

在另一个函数中,我传入arr,我想确定arr中的大小(元素数量).我打电话的时候

int arr_sz = sizeof(arr)/sizeof(int);
Run Code Online (Sandbox Code Playgroud)

它只返回1,这只是我假设(4/4)= 1的两个参数的int中的字节数.我只是假设它与使用数组相同

  int arr[8];
  int arr_sz = sizeof(arr)/sizeof(int);
Run Code Online (Sandbox Code Playgroud)

它返回数组中实际的元素数.

如果有人能清楚这一点,那就太好了.谢谢!

Sad*_*que 8

int *arr;   ----> Pointer
int arr[8]; ----> Array
Run Code Online (Sandbox Code Playgroud)

首先你得到了什么 - int *arr是一个指针,指向一些字节的内存位置,而不是一个数组.

类型的数组和一个指针的是不一样的.

在我传入arr的另一个函数中,我想确定arr中的大小(数字元素).我打电话的时候

int arr_sz = sizeof(arr)/sizeof(int);
Run Code Online (Sandbox Code Playgroud)

它只返回1,这只是我假设(4/4)= 1的两个参数的int中的字节数.我只是假设它与使用数组相同

即使是假定阵列-这是因为,当传递到功能阵列得到腐朽为指针.您需要在函数中显式传递数组大小作为单独的参数.

通过这个:

C编程语言中数组的大小?

static数组和动态内存分配之间存在差异.

sizeof运算符不适用于动态分配.AFAIK最适合基于堆栈和预定义的类型.