[英]Why does this lead to an segmentation fault in C
我試圖把我的指針指向傳遞給它的參數,但它導致了分段錯誤
#include <stdio.h>
void putPointer ( int *point, int num ) {
point = #
}
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()
您嘗試分配point
但point
是p
的副本,因此p
保持不變。 由於p
仍未初始化,它可以訪問任何地址並且*p
會導致 seg-fault。
您實際上可以通過期望int **point_ptr
作為參數、傳遞&p
並執行*point_ptr=#
來更改p
但你會遇到另一個問題。 實際上,一旦 function 返回, num
就會消失,因此將其地址保留在p
中是不正確的:使用*p
時num
不再存在。
&num
將是堆棧上 num 的地址。 您正在嘗試取消引用printf("%d\n", *p);
.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.