gpt4 book ai didi

C 堆/堆栈和函数返回值

转载 作者:行者123 更新时间:2023-12-02 05:49:39 24 4
gpt4 key购买 nike

抱歉,如果这是一个“基本”问题,但我是 C 新手,找不到答案。我的问题是关于是否需要 malloc一个变量并在函数内返回其指针,与在函数内创建变量和 return 相比结果。

想到的第一个问题是,一旦函数终止,在函数范围内声明的任何变量都会被销毁;那么为什么下面是有效的:

int add(int a, int b)
{
int result;
result = a + b;
return result;
}

但是下面是不是?
char *concat(char* a, char* b)
{
char result[10];
strcat(result, a);
strcat(result, b);
return result;
}

你得到的警告是你正在返回一个局部变量的地址,但这也是我们在第一个函数中所做的?行为是否因类型而异?

举一个更真实的例子,我很困惑我应该使用以下两个函数中的哪一个,因为它们都非常适合我的程序:
struct Card *card_create(enum Rank rank, enum Suit suit)
{
struct Card *card = malloc(sizeof(struct Card));
if(card == NULL) {
fprintf(stderr, "malloc: %s", strerror(errno));
return NULL;
}
card->rank = rank;
card->suit = suit;
return card;
}

或者:
struct Card card_create(enum Rank rank, enum Suit suit)
{
struct Card card;
card.rank = rank;
card.suit = suit;
return card;
}

再次,对不起,如果这是一个菜鸟问题,但我真的很感激解释。谢谢!

最佳答案

在您的 add()函数,返回其局部变量 result 中保存的值(直到函数退出) .一旦函数返回,该变量的存储不再可用,但存储在那里的值只是一个数字,本身并不依赖于该存储。

在您的 concat()函数,表达式 result计算结果为指向 10 char 数组的本地存储的指针.您仍然可以返回指针的值,但是一旦函数退出,该值的含义就不再定义。

所以,不,在这些情况下返回值的行为本身并没有什么不同,但是与这样做相关的有用性 - 实际上是风险 - 差别很大。

关于C 堆/堆栈和函数返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24769144/

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