为什么malloc不能多次分配?

时间:2014-12-17 14:34:54

标签: c malloc

我编写了一个简单的来源。它包含一个队列和一些队列需要的函数,但由于某种原因,malloc()只能运行一次。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



#define QUEUE       sizeof(Queue)

节点的定义,它是列表的一个元素,以及队列。

typedef struct node {
    char * value;
    struct node * next;
} Node;

typedef struct queue {
    Node * head;
    Node * tail;
} Queue;



int initialization(void ** list, int type){
    int code = -1;
    //create an empty list. 
    //if queue dynamically allocate memory and assign NULL to both properties head and tail. 


    return code;    
}

enqueue()一次在队列中添加一个元素。但由于某种原因,它只能添加一个元素,然后程序崩溃。

int enqueue(Queue * q, char * instruction){
    int code = -1;
    if(q != NULL){
        printf("Prepare to enqueue!\n");
        Node * n = NULL;
        n = (Node*)malloc(sizeof(Node));
        if(n != NULL){
            printf("Node created!\n");
            strcpy(n->value, instruction);
            n->next = NULL;

            //if first value
            if(q->head == NULL){
                q->head = n;
                q->tail = n;

                printf("Enqueue first Node\n");
            }
            else {
                q->tail->next = n;
                q->tail = n;
                printf("Enqueue another Node\n");
            }
            code = 0;
            printf("Node \"%s\" Enqueued\n", instruction);
        }
    }
    return code;
}

int dequeue(Queue * q){
    int code = -1;
    //dequeuing code here.
    return code;
}


int isEmpty(void * list, int type){
    int code = 0;
    //check if the list is empty

    return code;
}

main()函数中的for循环永远不会达到3

int main(int argc, char * argv[]){

    Queue * queue = NULL;

    initialization((void*)&queue, QUEUE);

    int i = 0;

    for(i = 0; i < 3; i++){
        if(enqueue(queue, "some value") != 0){
            printf("couldn't add more Node\n");
            break;
        }
    }

    while(!isEmpty(queue, QUEUE)){
        dequeue(queue);
    }

    return 0;
}

初始化函数是以这种方式编写的,因为它也应该能够初始化堆栈(我删除了堆栈代码以减少源代码,但即使没有它,bug仍然存在)。我还把printfs调试代码。而且我有足够的内存来使这个简单的代码运行它应该如何运行。

提前致谢!

1 个答案:

答案 0 :(得分:4)

运行这个,我崩溃了一个分段错误,正如我所料:

n = (Node*)malloc(sizeof(Node));

n已分配,其内容未初始化且有效随机

if(n != NULL){

n不是NULL,所以......

  strcpy(n->value, instruction);

我们崩溃了。

看到问题? n->value是指向无处的指针。或者,到某个地方,但无处已知。无处。而我们只是将一个字符串转移到那个空间。

更改Node结构以使valuechar [SOME_SIZE],或使用strdup()代替strcpy(),为穷人实际分配一些内存的事情。

n->value = strdup(instruction);