引用堆中分配的变量
Referencing a variable allocated in heap
我最近学习了 C,但对我们如何引用堆中分配的内容感到有点困惑。
例如,假设我们做了如下操作:
void test(){
int *a;
a = (int*)(malloc(sizeof(int)*4));
a[0] = 1;
a[1] = 2;
a[2] = 0;
a[3] = 0;
}
现在,假设我在 main 中,显然,我不能在函数外做类似 a[0]=...
的事情,因为没有对 a
的引用,但它是在堆中分配的,所以我将如何参考它?我猜我必须 return 一个 int*
或将地址存储到函数外的 a
。
I am guessing I'd have to return an int*
or store the address to a
outside the function.
是的,这正是它的工作原理。
malloc
为您分配一个内存块,returns 一个指向该内存块第一个字节的指针。
您必须确保始终保留指向内存块的指针,直到您对其调用 free
。
这可以通过从函数返回指向它的指针来完成:
int* test(void){
int *a;
a = (int*)(malloc(sizeof(int)*4));
//... (Also check here that malloc didn't return NULL.)
return a;
}
或将其存储在其他地方,例如传递给函数的输出参数或全局变量。
如果您离开函数而没有在任何地方存储或返回指针的副本,那么您将失去指向内存块 (a
) 的最后一个指针,并且将无法再次访问它。
后一种情况称为 内存泄漏。
store the address to a
应该是a
持有的地址,而不是a
的地址。 a
的值是分配内存的第一个字节的地址。 a
的地址是指针变量本身的地址。
我最近学习了 C,但对我们如何引用堆中分配的内容感到有点困惑。
例如,假设我们做了如下操作:
void test(){
int *a;
a = (int*)(malloc(sizeof(int)*4));
a[0] = 1;
a[1] = 2;
a[2] = 0;
a[3] = 0;
}
现在,假设我在 main 中,显然,我不能在函数外做类似 a[0]=...
的事情,因为没有对 a
的引用,但它是在堆中分配的,所以我将如何参考它?我猜我必须 return 一个 int*
或将地址存储到函数外的 a
。
I am guessing I'd have to return an
int*
or store the address toa
outside the function.
是的,这正是它的工作原理。
malloc
为您分配一个内存块,returns 一个指向该内存块第一个字节的指针。
您必须确保始终保留指向内存块的指针,直到您对其调用 free
。
这可以通过从函数返回指向它的指针来完成:
int* test(void){
int *a;
a = (int*)(malloc(sizeof(int)*4));
//... (Also check here that malloc didn't return NULL.)
return a;
}
或将其存储在其他地方,例如传递给函数的输出参数或全局变量。
如果您离开函数而没有在任何地方存储或返回指针的副本,那么您将失去指向内存块 (a
) 的最后一个指针,并且将无法再次访问它。
后一种情况称为 内存泄漏。
store the address to
a
应该是a
持有的地址,而不是a
的地址。 a
的值是分配内存的第一个字节的地址。 a
的地址是指针变量本身的地址。