簡體   English   中英

為什么代碼給出分段錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM