因此,当我传递一个像结构这样的数据类型来为其分配一些内存时,我发现指针在主作用域内没有改变。当我试图释放内存时,这进一步成为一个问题,但很明显,如果它使用原始指针,它将指向堆栈地址。
void allocate(int *value){
value = malloc(10 * sizeof(int));
}
int main(){
int val2;
allocate(&val2);
free(&val2);
return 0;
}
我可以通过使用双指针将其传递到allocate函数来解决这个问题,但我正在做的一些课程工作只需要传递一个指针,当指针返回到main时,我无法让它更新指针。我四处寻找了一段时间,但找不到一个直截了当的答案,我觉得我的作业是错误的,但那可能是我缺乏理解。
;只传递一个指针";这似乎是人为的,您可以争辩说,指向指针的指针(而不是"双指针"(是指针,但也许您可以使用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;
}
请注意,在调用分配之前设置结构中的容量违反了软件设计的许多原则,但由于奇怪的人为限制,这整件事都是荒谬的。
每个地方都没有足够的*,但你必须弄清楚这意味着什么。
void allocate(int** value){
*value = malloc(10 * sizeof(int));
}
int main(){
int* val2;
allocate(&val2);
free(val2);
return 0;
}