因此,當我傳遞一個像結構這樣的資料型別來為其分配一些記憶體時,我發現指標在主范圍內沒有改變。當我嘗試釋放記憶體時,這進一步成為一個問題,但顯然如果它使用原始指標,它將指向堆疊地址。
void allocate(int *value){
value = malloc(10 * sizeof(int));
}
int main(){
int val2;
allocate(&val2);
free(&val2);
return 0;
}
我可以通過使用雙指標傳遞給分配函式來解決這個問題,但是我正在做的一些課程作業只需要傳遞一個指標,當它回傳到 main 時我無法讓它更新指標。我環顧了一段時間,但找不到一個直截了當的答案,我覺得我的課程是錯誤的,但這可能是我缺乏理解。
uj5u.com熱心網友回復:
“只傳遞一個指標”的要求似乎是做作的,你可能會爭辯說指向指標的指標(不是“雙指標”)是一個指標,但也許你可以用來void *在型別系統中打一個洞。或使用結構:
#include <stdlib.h>
#include <stdio.h>
struct intbuffer {
int *d;
size_t cap;
};
void *
xmalloc(size_t s)
{
void *r = malloc(s);
if( r == NULL ){
perror("malloc");
exit(1);
}
return r;
}
void
allocate(void *p, size_t s)
{
*(int **)p = xmalloc(s * sizeof(int));
}
void
allocate2(struct intbuffer *p)
{
p->d = xmalloc(p->cap * sizeof *p->d);
}
int
main(void)
{
int *val2;
struct intbuffer v;
allocate(&val2, 10);
free(val2);
v.cap = 10; /* Horrible api!! */
allocate2(&v);
free(v.d);
return 0;
}
請注意,在呼叫 allocate 之前在結構中設定容量違反了許多軟體設計原則,但是由于奇怪的人為限制,這整個事情都是荒謬的。
uj5u.com熱心網友回復:
每個地方都沒有足夠的*,但你必須弄清楚這意味著什么。
void allocate(int** value){
*value = malloc(10 * sizeof(int));
}
int main(){
int* val2;
allocate(&val2);
free(val2);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/527281.html
標籤:C指针记忆malloc
