分段故障11:10

时间:2017-11-03 14:01:48

标签: c

我遇到解决问题的问题。我继续分段错误: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;
}

1 个答案:

答案 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提供良好的对称性。