[英]Assigning address of pointer to pointer-to-pointer
我正在嘗試使用指針來制作簡單的C代碼,但是內存被意外覆蓋。
我想創建一個指向整數的指針數組,然后創建一個指向整數的指針,並將其地址分配給數組。
因此,數組將指向一個指向整數的指針。 我是在名為add_value_to_array()
的函數中完成此操作的。
這是我的代碼:
void add_value_to_array(int *** array, int * value) {
*array = &value;
}
int main() {
int ** arr = { 0 };
int value = 5;
int * value_ptr = &value;
add_value_to_array(&arr, value_ptr);
//arr = &value_ptr;
printf("looool\n");
printf("looool\n");
printf("looool\n");
printf("looool\n");
printf("%p\n", arr[0]);
}
我想要的是:
arr -> value_ptr -> 5
(arr = &value_ptr
*array = value_ptr
value_ptr = &value
*value_ptr = 5
**arr = 5)
但是,這是在add_value_to_array()
之后所add_value_to_array()
,但是當我調用printfs()
時,內存被覆蓋了,我的arr
變量中得到了垃圾值。
甚至很奇怪,如果我直接執行arr = &value_ptr
而不是調用add_value_to_array
,事情也會按預期進行,並且內存不會被printfs()
覆蓋。
因此,如果我使用一個函數或執行其他操作,則似乎內存分配有所不同。
我看到此行為是怎么回事?
遵循以下假設:您想要創建一個長度為1(可能更長的長度)的數組,該數組指向int。 並且您希望數組中的單個指針指向名為“值”的局部變量。
然后:
int* arr[] = { 0 }; // or { NULL }, if you prefer
// ^ creates an array; either you specify size explicitly or it will be deduced
// from initializer, as in this case
如果將數組傳遞給函數,則數組會自動衰減為指向第一個元素的指針。 所以:
add_value_to_array(arr, &value);
// ^ decays to pointer
// ^ here you still need a pointer; you can create it directly, though
剩下的小問題: arr
到指針的arr
類型為int**
。 您的函數中需要相同的類型:
void add_value_to_array(int** array, int* value)
// ^ one asterisk less
{
*array
// ^ this one is NOW correct: array points to the first element of arr
// dereferencing gives you exactly this element, i. e. the pointer
= /* & */value;
// ^ must be dropped: you already have a pointer and you assign it to
// another one, which is fine.
}
請注意,指針只是內存中某處變量的地址。 有點簡化:
int n = 10;
int* p0 = &n;
int* p1 = &n; // p1 and p0 point both to the same variable n
int* p2 = p0; // now again p2 points to n
*p0 = 12; // change the value pointed to
printf("%d\n", *p2); // will print 12, as both pointers point to the same address.
函數參數在這方面沒有區別,它們只是普通變量。 如果指針是數據值或指針本身,它將不起作用:
int n = 10;
int m = 12;
int* p = &n;
int** p1 = &p; // pointer to pointer to int
int** p2 = p1; // both p1 and p2 point to p
*p1 = &m; // re-assign the POINTER
printf("%d\n", **p2); // again prints 12:
// p1 and p2 both point to p which was reset to m, though...
謝謝大家的回答,這幫助我找到了錯誤:我必須按地址而不是按值傳遞value_ptr。
這是我的更正代碼:
void add_value_to_array(int *** array, int ** value_ptr) {
*array = value_ptr;
}
int main() {
int ** arr = { 0 };
int value = 5;
int * value_ptr = &value;
add_value_to_array(&arr, &value_ptr);
//arr = &value_ptr;
printf("looool\n");
printf("looool\n");
printf("looool\n");
printf("looool\n");
printf("%p\n", arr[0]);
}
謝謝大家的幫助 !
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.