抱歉,如果这是一个“基本”问题,但我是 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/