簡體   English   中英

將指針地址分配給指針到指針

[英]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.

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