[英]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
返回之前存在。 一旦f1
返回, 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.