我编写了一个简单的源代码。它包含一个队列和队列所需的一些函数,但由于某种原因,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);