我遇到解决问题的问题。我继续分段错误:11错误,而我尝试此代码。每当我更改代码时,错误就会弹出,我不知道这个漏洞在哪里,所以如果有人看到这个漏洞,我会很高兴。
我提前感谢你。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "dbg.h"
typedef struct node{
char *data;
struct node *next;
} node_t;
node_t **push(node_t **head, char *data){
node_t *new_node;
new_node = malloc(sizeof(node_t));
new_node->data = data;
new_node->next = *head;
*head = new_node;
free(new_node);
return head;
}
int main(int argc, char *argv[])
{
node_t **head;
char *data = "hoi";
char *data2 = "hallo";
head = malloc(20 * sizeof(node_t));
head = push(head, data);
head = push(head, data2);
printf("%s\n",(*head)[1].data);
free(head);
return 0;
}
答案 0 :(得分:1)
缺陷:
push()
函数会将new_node
的值分配给*head
,使push()
的调用者可以访问它,但在函数结束时您可以new_node
head
1}},使它成为一个悬垂的指针。这是分段错误的良好基础。malloc()
是指向指针的指针,但是被分配了push()
invokation的结果,似乎表明它应该是指向节点的指针。main()
中的#include <stdio.h>
#include <stdlib.h>
struct node {
const char *data;
struct node *next;
};
static struct node *push(struct node *head, const char *data) {
struct node *node;
node = malloc(sizeof *node);
node->data = data;
node->next = head;
return node;
}
int main(int argc, char *argv[])
{
struct node *head = NULL;
const char *data = "hoi";
const char *data2 = "hallo";
head = push(head, data);
head = push(head, data2);
struct node *node = head;
while (node) {
printf("%s\n", node->data);
node = node->next;
}
return 0;
}
或中分配内存吗?当然,两者都不是一个好的选择。以下是您的程序版本:
push()
请注意,我实现了一个LIFO结构,也就是说。堆栈,因为pop()
函数通常适用于堆栈。
您的逻辑下一步是实现pop()
功能。通常,我建议x=2
释放节点并返回数据。这将为您的API提供良好的对称性。