嘿我试图将指针内存分配d =(deque*)malloc(sizeof(deque));
移动到名为void initDeque()
的第一个函数中。我试着在main
中留下声明并在函数中分配内存,但程序只是在初始化双端队列后崩溃,我不能在其他函数中使用指针。
以下是代码:
int main(){
int x;
deque *d;
d = (deque*)malloc(sizeof(deque));
initDeque(d);
putFront(d,10);
我希望为指针移动内存分配的函数:
void initDeque(deque *d){ //Create new deque
//d = (deque*)malloc(sizeof(deque));
printf("Initializing deque\n");
d->front=NULL;
d->rear=NULL;
}
如果声明和分配在main()
中,程序运行得很好,但是当我将分配放入void initDeque
时它会崩溃。
答案 0 :(得分:3)
一种解决方案是将指针传递给指针:
int main()
{
deque *d;
initDeque( &d );
}
void initDeque( deque **d )
{
*d = malloc( sizeof( deque ) );
}
答案 1 :(得分:3)
C中的参数(甚至指针)为passed by value。
所以返回指针:
deque *make_queue(){ //Create new deque
deque *d = malloc(sizeof(deque));
if (!d) { perror("malloc"); exit(EXIT_FAILURE); };
printf("Initializing deque\n");
d->front=NULL;
d->rear=NULL;
return d;
}
并在d = make_queue();
开始时致电main
;在执行malloc
时总是测试失败。
或者,传递指针的地址,如answered by clcto
在C dynamic memory management上阅读wikipage。不要忘记恰当地致电free
。要进行调试,请使用valgrind(如果有)。避免使用memory leaks(以及加倍free
- s)。当您在C中更成熟时,请阅读garbage collection上的wikipage,或许在某些情况下考虑使用Boehm conservative garbage collector。
答案 2 :(得分:1)
调用函数时,您将d变量中的值作为参数发送给函数而不是其指针(也称为内存地址)。
initDeque(d);
为了发送指针本身,你必须发送它的内存地址:
initDeque(&d);
为此,我还建议您使用指针指针,这样即使您尚未使用memalloc,也可以发送您假装分配数据的地址。
如果你试图显示它,那么& d的值将是一个内存地址,所以请确保你以后记住它的指针。