C动态内存分配和sizeof()

gc0ot86w  于 2023-04-11  发布在  其他
关注(0)|答案(8)|浏览(168)

我很难理解这两个代码段之间的区别:我用下面的语句在代码中为整数数组动态分配空间

int *arr = calloc(cnt, sizeof(int));

在另一个函数中,我传入arr,我想确定arr中的大小(元素数)。

int arr_sz = sizeof(arr)/sizeof(int);

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

int arr[8];
  int arr_sz = sizeof(arr)/sizeof(int);

返回数组中元素的实际数量。
如果有人能把这个弄清楚,那就太好了,谢谢!

rqmkfv5c

rqmkfv5c1#

int *arr;   ----> Pointer
int arr[8]; ----> Array

首先,int *arr是一个指针,* 指向一些 * 字节的内存位置,* 不是 * 一个数组。

Array和Pointer的 type 不一样

  • 在我传入arr的另一个函数中,我想确定arr中的大小(元素数量)。当我调用 *
int arr_sz = sizeof(arr)/sizeof(int);
  • 它只返回1,这只是一个int中两个参数的字节数,我假设(4/4)=1。我只是假设它和使用数组一样 *

即使它被 * 假定 * 为 * 一个数组--这是因为数组在传递给函数时会衰减为指针。你需要在函数中显式地传递数组大小作为一个单独的参数。
通过这个:
Sizeof an array in the C programming language?
static数组和动态内存分配之间存在差异。
sizeof运算符不能用于动态分配。AFAIK它最适合基于堆栈的和预定义的类型。

pengsaosao

pengsaosao2#

int *arr声明了一个指针,一个保存其他变量地址的变量,它的大小是一个整数的大小,因为它是一个指针,它只需要保存地址,而不是指针本身。
int arr[8]声明了一个数组,一个整数的集合。sizeof(arr)指的是整个集合的大小,所以8*sizeof(int)。
你经常听到“数组和指针是一回事”。这不是真的!它们是不同的东西。

slmsl1lt

slmsl1lt3#

迈克
arr是一个指针,因此,至少在您的系统上,与int具有相同的字节数。数组的类型并不总是与指向数组类型的指针相同。

ctrmrzij

ctrmrzij4#

sizeof(arr)sizeof(int*)相同,即单个指针的大小。然而,您可以将arr_sz计算为... cnt

0dxa2lsx

0dxa2lsx5#

*arrarr[8]不同,因为它的大小在编译时是未知的,而sizeof是编译器的一个函数。因此,当您的arr*arr时,sizeof将返回指针的大小。(sizeof(int *)),而当你的arrarr[8]时,sizeof将返回8个整数的数组的大小(which is sizeof(int) * 8)。
当你传递一个指向数组的指针给一个函数时,你必须指定它的大小,因为编译器不能为你做这件事。另一种方法是用null元素结束数组,然后执行一个while循环。

vkc1a9a2

vkc1a9a26#

如果你有int arr1[8],arr1的类型(就编译器而言)是一个大小为8的int数组。
int * arr2例子中,arr2的类型是一个整型指针。
sizeof(arr1)是int数组的大小
sizeof(arr2)是int指针的大小(32位系统上为4字节,64位系统上为8字节)
所以,唯一的区别是编译器认为变量是什么类型。

jmp7cifd

jmp7cifd7#

sizeof不能用于内存指针:

int *arr = calloc(cnt, sizeof(int));

但是可以将其用于数组:

int arr[8];
wljmcqd8

wljmcqd88#

我今天遇到了同样的问题,并打算提出新的问题,但在这篇文章中找到了我的答案。只是张贴我的答案,因为我甚至其他人都可以发现它很有用。这是我的代码:

#include <stdio.h>
#include <stdlib.h>

struct Data
{
    int* array;
};

    int main(int argc, char* argv[])
    {
        struct Data *data = (struct Data*)malloc(sizeof(struct Data));
    
        data->array = (int*)malloc(sizeof(int) * 10);
    
        printf("\ndata struct size: %u", sizeof(data));
        printf("\narray size: %u", sizeof(data->array));
    
        free(data->array);
        free(data);
    
        getchar();
        return 0;
    }

输出:

data struct size: 4
array size: 4

这里我期望数组的总大小可能是40,但由于sizeof运算符不适用于动态分配的数组,它只返回int指针的大小4。仅供参考,我使用Visual Studio 2017与Windows 10

相关问题