我剛開始使用 C,我有些困惑。舉個例子:
int *first=0;
int second=1;
if(*first<second)
{
printf("Works\n");
}
上面的例子應該給我列印并完成代碼。相反,它給了我一個段錯誤,但 IDE 告訴我沒有問題。首先,我不是給出了指標指向的值嗎?我在這里錯過了什么?
uj5u.com熱心網友回復:
在int *first=0;,0初始化first,不是*first。也就是說,它將指標設定為 0(創建一個空指標)。空指標不指向任何物件。
C 標準沒有定義嘗試使用空指標來訪問物件的行為,因此*first<second沒有定義的行為。一個常見的結果是程式嘗試訪問地址零,并且配置了行程的虛擬記憶體,從而導致產生硬體例外,并且程式終止。
(但是,編譯期間的程式優化也有可能將使用空指標的嘗試轉換為其他代碼,導致您的程式以神秘的方式運行,直到您熟悉優化的效果。)
要解決此問題,您需要設定first為指向正確的物件。您可以通過使其指向某個其他命名物件來執行此操作,例如:
int x;
int *first = &x;
或者通過為其分配記憶體:
int *first = malloc(sizeof *first);
if (!first)
{
fprintf(stderr, "Error, failed to allocate memory.\n");
exit(EXIT_FAILURE);
}
如果您分配記憶體,那么您通常希望在程式稍后釋放它,使用free(first), 在您完成使用它之后。
uj5u.com熱心網友回復:
看看你的代碼
int *first=0;
int second=1;
if(*first<second)
{
printf("Works\n");
}
first是指向int其指向地址0(即,一個空指標)。因此,不允許讀取地址 0 處的記憶體,因為它不指向任何有效物件,這會產生segfault。所以,你需要給指標一個有效的地址。
相反,您可以嘗試為指標提供包含該值的變數的有效地址 0
像這樣 ...
int x = 0;
int* first = &x;
int second = 1;
if(*first < second)
{
printf("Works\n");
}
uj5u.com熱心網友回復:
首先,我不是給出了指標指向的值嗎?
不。您提供的是指標本身的值。線
int *first=0;
是說“first應該是一個指向地址 0 的指標。”。
然后您嘗試訪問該地址中存盤的不存在的值,從而導致未定義的行為。
uj5u.com熱心網友回復:
隨著int *first=0您將 [first] 宣告為指標并將該指標的值初始化為 0。從那時起,[first] 指向第 0 個記憶體位置,這不會出錯。但是,不允許在此階段取消參考指標(從記憶體地址 = 0 讀取)。
uj5u.com熱心網友回復:
試試這個
int *first=(int*)malloc(sizeof(int));//allocate a pointer of type int
*first=0;//initialize *first with 0
int second=1;
if(*first<second)
{
printf("Works\n");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/392683.html
上一篇:僅使用指標的輸入陣列
