C语言 为什么 malloc 无法分配多次

  • 本文关键字:分配 malloc 语言 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 Noden");
            }
            else {
                q->tail->next = n;
                q->tail = n;
                printf("Enqueue another Noden");
            }
            code = 0;
            printf("Node "%s" Enqueuedn", 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 Noden");
            break;
        }
    }
    while(!isEmpty(queue, QUEUE)){
        dequeue(queue);
    }
    return 0;
}

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

提前感谢!

运行这个,我崩溃了,出现分段错误,正如我所期望的那样:

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

n分配,它的内容未初始化且实际上是随机的

if(n != NULL){

n不是空的,所以...

  strcpy(n->value, instruction);

我们崩溃了。

看到问题了吗? n->value是指向无处的指针。或者,到某个地方,但无处可寻。无处。 我们只是把一根绳子转储到那个空间里。

要么更改Node结构,使value是一个char [SOME_SIZE],要么使用strdup()而不是strcpy(),实际上为可怜的东西分配一些内存。

n->value = strdup(instruction);

相关内容

  • 没有找到相关文章

最新更新