gpt4 book ai didi

c - 为什么一个函数可以返回一个由 malloc 设置的数组而不是一个由 "int cat[3] = {0,0,0};"设置的数组

转载 作者:太空狗 更新时间:2023-10-29 15:43:54 24 4
gpt4 key购买 nike

为什么我可以从函数返回一个由 malloc 设置的数组:

int *dog = (int*)malloc(n * sizeof(int));

但不是由

设置的数组
 int cat[3] = {0,0,0};

返回“cat[ ]”数组并带有警告。

谢谢大家的帮助

最佳答案

这是一个范围问题。

int cat[3]; // declares a local variable cat

局部变量与 malloc 的内存

局部变量存在于栈中。当这个函数返回时,这些局部变量将被销毁。届时,用于存储数组的地址将被回收,因此您无法保证它们的内容。

如果您调用 malloc,您将从堆中分配内存,因此内存将在您的函数生命周期结束后继续存在。

如果函数应该返回一个指针(在这种情况下,一个指向整数数组首地址的指针),该指针应该指向良好的内存。 Malloc 是确保这一点的方法。

避免 Malloc

您不必在函数内部调用 malloc(尽管这样做是正常且适当的)。

或者,您可以将一个地址传递到您的函数中,该地址应该保存这些值。您的函数将完成计算值的工作,并填充给定地址的内存,然后返回。

其实这是一种常见的模式。但是,如果这样做,您会发现不需要返回地址,因为您已经知道所调用函数之外的地址。因此,返回一个指示例程成功或失败的值(如 int)比返回相关数据的地址更为常见。

这样,函数的调用者就可以知道数据是否已成功填充或是否发生错误。

#include <stdio.h>             // include stdio for the printf function

int rainCats (int *cats); // pass a pointer-to-int to function rainCats

int main (int argc, char *argv[]) {

int cats[3]; // cats is the address to the first element

int success; // declare an int to store the success value
success = rainCats(cats); // pass the address to the function

if (success == 0) {
int i;
for (i=0; i<3; i++) {
printf("cat[%d] is %d \r", i, cats[i]);
getchar();
}
}

return 0;
}

int rainCats (int *cats) {
int i;
for (i=0; i<3; i++) { // put a number in each element of the cats array
cats[i] = i;
}
return 0; // return a zero to signify success
}

为什么这行得通

请注意,您不必在此处调用 malloc,因为 cats[3] 是在 main 函数内部声明的。 main 中的局部变量只有在程序退出时才会被销毁。除非程序非常简单,否则 malloc 将用于创建和控制数据结构的生命周期。

另请注意,rainCats 被硬编码为返回 0。rainCats 内部不会发生任何会使其失败的事情,例如尝试访问文件、网络请求或其他内存分配。更复杂的程序有很多失败原因,因此返回成功代码通常是有充分理由的。

关于c - 为什么一个函数可以返回一个由 malloc 设置的数组而不是一个由 "int cat[3] = {0,0,0};"设置的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6804901/

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