移动指针从main()到函数的内存分配以及在其他函数中使用指针

时间:2015-03-17 17:02:18

标签: c pointers memory

嘿我试图将指针内存分配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时它会崩溃。

3 个答案:

答案 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的值将是一个内存地址,所以请确保你以后记住它的指针。