C 堆/堆栈和函数返回值

标签 c

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

相关文章:

C - 在 RAM 中运行程序

c - 为什么我无法使用以下代码显示字符串?

c - 使用 select(...) 作为事件驱动循环?

c - 将 va_list 传递给多个函数而不调用 va_arg

对 dtostrf 函数感到困惑

c++ - Macports cgal 不工作!我如何解决它?

c - 函数指针的自由数组

c - 使用 qsort 时出现段错误

c - 如何高效计算 2^n-1 而不会溢出?

c - 当其中一个字段是数组时,如何初始化结构的所有字段?