gpt4 book ai didi

c - 我对 C 上的 malloc() 和 calloc() 很困惑

转载 作者:太空狗 更新时间:2023-10-29 16:23:45 25 4
gpt4 key购买 nike

我一直用 Java 编程,这可能就是我对此如此困惑的原因:

在 Java 中我声明了一个指针:

int[] array

并初始化它或分配一些内存:

int[] array = {0,1,0}
int[] array = new int[3]

现在,在 C 语言中,一切都变得如此困惑。起初我认为它就像声明一样简单:

int array[]

并初始化它或分配一些内存:

int array[] = {0,1,0}
int array[] = malloc(3*sizeof(int))
int array[] = calloc(3,sizeof(int))

除非我错了,否则以上所有内容都等同于 Java-C,对吧?

然后,今天我遇到了一段代码,我在其中发现了以下内容:

pthread_t tid[MAX_OPS];

以及下面的一些行,没有任何类型的初始化...

pthread_create(&tid[0],NULL,mou_usuari,(void *) 0);

令人惊讶的是(至少对我而言),代码有效!至少在 Java 中,这会返回一个不错的“NullPointerException”!

所以,按顺序:

  1. 我对所有 Java-C“翻译”是否正确?

  2. 为什么该代码有效?

  3. 使用 malloc(n*sizeof(int))calloc(n,sizeof(int)) 有什么区别吗?

提前致谢

最佳答案

您不能将内存分配给数组。数组在其整个生命周期内具有固定大小。数组永远不能为空。数组不是指针。

malloc 将地址返回到为程序保留的内存块。您不能将那个(作为内存块)“分配”给一个数组,但是您可以将这个内存块的地址存储在一个指针中:幸运的是,数组订阅是通过指针定义的——所以您可以“像数组一样使用指针” ,例如

int *ptr = malloc(5 * sizeof *ptr);
ptr[2] = 5; // access the third element "of ptr"
free(ptr); // always free at the end

当您声明一个没有大小的数组(即 array[])时,这仅意味着数组的大小由初始化列表确定。也就是

int array[] = {1, 2, 3, 4, 5}; // is equal to
int array[5] = {1, 2, 3, 4, 5};

尝试声明一个没有大小且没有初始值设定项的数组是错误的。


代码 pthread_t tid[MAX_OPS]; 声明了一个名为 tid 的数组,类型为 pthread_t,大小为 MAX_OPS.

如果数组有自动存储(即声明在函数内部而不是静态的,不是全局的),那么每个数组元素都有不确定的值(并且它会导致试图读取这样的值的未定义行为)。幸运的是,函数调用所做的只是将数组第一个元素的地址作为第一个参数,并可能在函数内部对其(元素)进行初始化。


callocmalloc 的区别在于calloc 返回的内存块被初始化为零。也就是;

int *ptr = calloc(5, sizeof *ptr);
// is somewhat equal to
int *ptr = malloc(5 * sizeof *ptr);
memset(ptr, 0, 5 * sizeof *ptr);

两者的区别

int *ptr = malloc(5 * sizeof *ptr);
// and
int array[5];

array有自动存储,(存储在栈上),超出作用域后“释放”。但是,ptr(存储在堆上)是动态分配的,并且必须由程序员释放

关于c - 我对 C 上的 malloc() 和 calloc() 很困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4237896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com