为什么代码给出分段错误?
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 之前存在。一旦f1
returns、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 allocation
或dynamic 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
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 之前存在。一旦f1
returns、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 allocation
或dynamic 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