#include <stdio.h>
int main(void)
{
int* ptr = NULL;
*ptr = 10;
printf("%d", *ptr);
return 0;
}
我對 C 編程非常陌生,如果它變得無知,請提前道歉。我正在嘗試輸入一個值,訪問分配給 NULL 但它不起作用的指標變數。
我的猜測是,這是因為 *ptr 應該指向某個陣列或變數的地址,如果不指向任何東西,它就不能包含值本身。
我的理解正確嗎?
uj5u.com熱心網友回復:
是的,你的理解是正確的,你不能做你代碼試圖做的事情
int main(void)
{
int* ptr = NULL; <<== creates a pointer that points noweher (null)
*ptr = 10; <<== store 10 where that pointer points
printf("%d", *ptr);
return 0;
}
在第二行中,您嘗試將 10 存盤在 'ptr' 指向的位置。但是 'ptr' 沒有指向任何地方,結果就是所謂的未定義行為。通常你的程式會停在那里
你可以這樣做
int main(void)
{
int* ptr = NULL; <<<=== create pointer to nothing
int val = 0; << == create int with value 0
ptr = &val; <<<== set ptr to point at val
*ptr = 10; <<< ====overwrite val with 10
printf("%d", *ptr);
return 0;
}
線
*ptr = 10;
和你做的一樣
val = 10;
你也可以做
int main(void)
{
int* ptr = NULL; <<<=== create pointer to nothing
ptr = malloc(sizeof(int); <<<== set ptr to point at dynamically allocated int
if(ptr==NULL) return -1; <<<=== make sure it worked
*ptr = 10; <<< === now set that dynamically allocated int to 10
printf("%d", *ptr);
return 0;
}
請注意,與前面的示例不同,沒有其他方法可以參考它int。(之前你可以交替使用 'val' 和 '*ptr')
uj5u.com熱心網友回復:
我的猜測是,這是因為 *ptr 應該指向某個陣列或變數的地址,如果不指向任何東西,它就不能包含值本身。
那是對的; *ptr = 10;不會更改 whereptr點,因此您必須先將其設定為指向可用記憶體。
int *ptr = NULL;初始化ptr為一個空指標值,這個值本質上意味著“無處”。它是一些不等于任何物件或函式的地址的值。(最常見的是,C 實作對空指標使用“零地址”。)
您可以ptr通過多種方式設定指向可用記憶體:
int x;
ptr = &x; // This sets ptr to point to x.
int a[17];
ptr = &a[3]; // This sets ptr to point to a[3].
ptr = &a[0]; // This sets ptr to point to a[0].
ptr = a; // This also sets ptr to point to a[0].
在最后一個示例中,陣列a自動轉換為指向a[0].
您還可以動態分配記憶體:
ptr = malloc(sizeof *ptr);
if (ptr == NULL)
{
fprintf(stderr, "Error, unable to allocate memory.\n");
exit(EXIT_FAILURE);
}
呼叫malloc要求系統保留記憶體。如果成功,則回傳記憶體地址。如果失敗,則回傳一個空指標,您應該始終通過在呼叫后進行測驗來處理這種可能性malloc。您可以#include <stdio.h>宣告fprintf和#include <stdlib>宣告exit和EXIT_FAILURE。
完成上述任何一項后,您可以執行*ptr = 10;將 10 存盤在ptr點的位置。
當您使用分配的記憶體時,您通常希望在完成后釋放它。你可以通過呼叫來做到這一點free(ptr)。
malloc(sizeof *ptr)ptr為型別指向的一個物件分配足夠的記憶體。N您可以使用 為物件分配記憶體ptr = malloc(N * sizeof *ptr)。之后,如果呼叫成功,您可以將值存盤在ptr[0], ptr[1], ...ptr[N-1]中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462800.html
