C堆/堆栈和函数返回值

Cri*_*ian 2 c

如果这是一个"基本"问题,请道歉,但我是C的新手,无法找到答案.我的问题是关于malloc变量的需要并在函数内返回其指针,与在函数内创建变量和return结果相比.

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

int add(int a, int b)
{
    int result;
    result = a + b;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

但以下不是?

char *concat(char* a, char* b)
{
    char result[10];
    strcat(result, a);
    strcat(result, b);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

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

对于一个更实际的例子,我非常困惑我应该使用以下哪两个函数,因为它们对我的程序都非常有效:

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;
}
Run Code Online (Sandbox Code Playgroud)

要么:

struct Card card_create(enum Rank rank, enum Suit suit)
{
    struct Card card;
    card.rank = rank;
    card.suit = suit;
    return card;
}
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ger 6

add()函数中,返回其局部变量中保持的(直到函数退出)result.函数返回后,该变量的存储不再可用,但存储的值只是一个数字,本身并不取决于该存储.

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

所以,不,返回值的行为在这些情况之间本身并不相同,但与此相关的有用性 - 实际上是风险 - 变化很大.