簡體   English   中英

為什么這會導致 C 中的分段錯誤

[英]Why does this lead to an segmentation fault in C

我試圖把我的指針指向傳遞給它的參數,但它導致了分段錯誤

#include <stdio.h>

void putPointer ( int *point, int num ) {
    point = &num;
}

int main(void) {

    int a = 42;

    int *p;
    // p = &a
    putPointer( p, a );

    printf( "%d\n", *p );

    return 0;
}

C 中的 Arguments 是傳遞的內容的副本,因此main()中的p function 在putPointer(p,a); . 使用不確定的未初始化非靜態局部變量的值會調用未定義的行為

另請注意,從函數返回時不應取出指向非靜態局部變量(包括 function 參數)的指針,並且在從函數返回后不得使用這些指針,因為非靜態局部變量在返回時無效。

putPointer()您嘗試分配pointpointp副本,因此p保持不變。 由於p仍未初始化,它可以訪問任何地址並且*p會導致 seg-fault。

您實際上可以通過期望int **point_ptr作為參數、傳遞&p並執行*point_ptr=&num;來更改p 但你會遇到另一個問題。 實際上,一旦 function 返回, num就會消失,因此將其地址保留在p中是不正確的:使用*pnum不再存在。

&num

將是堆棧上 num 的地址。 您正在嘗試取消引用printf("%d\n", *p); .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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