さて、私は関数の2つの層を通過しますfun1はfunc2を呼び出しますfunc3を呼び出します。基本的にint*ptrを使用してポインタを最後まで渡します。呼び出しスタックの最下位の「レベル」には、int配列にメモリを動的に割り当てる別の関数もあります。トップレベル(func1レベル)では、渡されたポインターに対して常にnullが返されます。func3までたどり着き、割り当てられたメモリが値でいっぱいになっていますが、コールスタックがfunc3-> func2をほどくと、ポインタが突然消えます(0x0000_0000)?func3レベルではわかりませんが、基本的にptr =locate_ptr_arrayと言いますが、その戻り値からNULLになります。私は記憶を解放しませんでしたが、世界で何が起こっているのでしょうか?私の質問は紛らわしいことを知っています。私はこれがデバッガーで起こるのを見てきましたが
3 に答える
6
ポインタは基本的に値によって渡されます。外部関数に割り当てられたメモリを取得するには、ポインタをポインタ(int ** p)に渡す必要があります。
function1(int *p)
{
p = //allocate memory using malloc
}
function2(int **p)
{
*p = //allocate memory using malloc
}
function3()
{
int *p;
function1(p);
// in this case pointer is passed by value.
//The memory allocated will not be available in p after the function call function1.
int **p;
function2(&p);
//in this case pointer to pointer p has been passed.
// P will have the memory allocated even after
//the function call function1
}
}
于 2009-08-05T02:55:00.373 に答える
2
いくつかのコードで aJ の (完全に正しい) 答えを照らすには:
void func1(void)
{
int *int_array;
func2(&int_array);
/* Some stuff using int_array[0] etc */
/* ... */
free(int_array);
}
void func2(int **a)
{
/* ... stuff ... */
func3(a);
/* .... stuff ... */
}
void func3(int **a)
{
(*a) = malloc(N * sizeof **a);
}
于 2009-08-05T03:02:03.887 に答える
0
これは、他の人が将来参照するための良い例です。実装後は理にかなっています。これらの人に感謝します。
#include <memory.h>
#include <stdlib.h>
#include <stdio.h>
void func3(int **ptr)
{
int i;
(*ptr) = (int *)malloc(25*sizeof(int));
for (i=0; i < 25; i++) (**ptr) = i;
printf("func3: %d\n",ptr);
}
void func2(int **ptr)
{
func3(ptr);
printf("func2: %d\n", ptr);
}
void func1(void)
{
int *ptr;
printf("ptr before: %d\n", ptr);
func2(&ptr);
printf("ptr after: %d\n", ptr);
}
void func4(int **ptr)
{
static int stuff[25];
printf("stuff: %d\n",stuff);
*ptr = stuff;
}
int main(void)
{
int *painter;
func1();
func4(&painter);
printf("painter: %d\n", painter);
return 0;
}
于 2009-08-05T04:57:46.070 に答える