为什么代码给出分段错误?

Why is the code giving Segmentation fault?

int *f1(int i) {
    return &i;
}

int main(void) {
    int x = 10;
    int *p = f1(x);
    printf("%d\n", *p);
    printf("%d\n", *p);
    return 0;
}

就算我写

int *p;
    p = f1(10);

这仍然会导致分段错误。

有人可以解释一下,为什么代码不起作用?

您返回的是 i 的地址,该地址仅在 f1 returns 之前存在。一旦f1returns、i不复存在,你创建的指针就不再可用了。取消引用它是未定义的行为。

也许你想要

#include <stdio.h>
#include <stdlib.h>

int *f1(int i) {
   int *p = malloc(sizeof(int));
   *p = i;
   return p;
}

int main(void) {
   int *p = f1(10);
   printf("%d\n", *p);
   free(p);
   return 0;
}

static allocationdynamic allocation的用法视问题情况而定。

static allocation 的场景:比方说,我们需要找到一个函数被调用的次数。然后我们需要一个变量,它的值应该在函数调用中更新和保留。如果我们在这里使用 dynamic allocation,将为每个函数调用创建新变量,并且您无法跨函数调用跟踪值。 Dyanmic allocation 在这里不起作用。如果函数调用次数很多,你最终会浪费大量内存。

场景 dynamic allocation :假设,你想为每个函数调用创建一个新变量,那么我们可以使用 dynamic .

注意:如果我们调用该函数100次,那么这100次只会使用一个静态变量。但是,在 dynamic allocation 的情况下,将创建 100 个新变量。所以,我们应该根据情况使用它们。

静态变量的生命周期是程序执行的整个持续时间。变量 i 生命周期在 f1 函数结束时结束。为了延长其生命周期,我们可以使用静态内存分配或动态内存分配(使用malloc)。

#include <stdio.h>

#include <stdlib.h>

int *f1(int i) {
   static int p; //value will be retained between function calls.
   p = i;
   return (&p);
}

int main(void) {
   int *p = f1(10);
   printf("%d\n", *p);
   printf("%d\n", *p);
   return 0;
}

输出为:

10
10