【问题标题】:How can I prevent segmentation faults in my program?如何防止程序中出现分段错误?
【发布时间】:2010-04-15 23:35:33
【问题描述】:

我有一个 C 作业。它比下面显示的代码要长很多,我们只给出了函数原型和说明。我在编写代码方面已经尽了最大努力,但我遇到了分段错误。当我在 Linux 上编译并运行下面的程序时,它会在“735 NaN”处终止,表明发生了段错误。为什么?我究竟做错了什么?基本上,程序不允许我访问 table->list_array[735]->value 和 table->list_array[735]->key。这当然是第一个段错误。可能有更多的关注索引 735。

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

typedef struct list_node list_node_t;

struct list_node
{ 
  char *key;
  int value;
  list_node_t *next;
};

typedef struct count_table count_table_t;

struct count_table {
  int size;
  list_node_t **list_array;
};


count_table_t* table_allocate(int size) 
{
    count_table_t *ptr = malloc(sizeof(count_table_t));

    ptr->size = size;

    list_node_t *nodes[size];

    int k;

    for(k=0; k<size; k++){
       nodes[k] = NULL;
    }

    ptr->list_array = nodes;

    return ptr;
}

void table_addvalue(count_table_t *table) 
{
    int i;

    for(i=0; i<table->size; i++)
    {
       table->list_array[i] = malloc(sizeof(list_node_t));
       table->list_array[i]->value = i;
       table->list_array[i]->key = "NaN";
       table->list_array[i]->next = NULL;
    }
}

int main()
{
      count_table_t *table = table_allocate(1000);
      table_addvalue(table);

      int i;

      for(i=0; i<table->size; i++)
          printf("%d  %s\n", table->list_array[i]->value, table->list_array[i]->key); 

      return 0;
}

【问题讨论】:

    标签: list linked-list segmentation-fault


    【解决方案1】:

    您将 ptr-&gt;list_array 指向 table_allocate 中的局部变量 (nodes),当该函数返回时该变量消失,留下一个悬空指针。你可能想要

    list_node_t **nodes = malloc(size * sizeof(list_node_t *));
    

    【讨论】:

    • 非常感谢。你帮我解决了这个问题。
    • (size * sizeof(list_node_t *)) 和 (size * sizeof(list_node_t)) 有什么区别??后者没有星号,我也注意到后者分配了更多的内存。
    • list_node_t * 指的是指针——指向任何类型的指针的大小仅取决于您的机器/编译器,通常为 32 位或 64 位(它本质上只是一个整数)。 sizeof(list_node_t) 足以容纳 list_node_t 实例的大小,足以容纳 list_node_t 的所有成员以及一些填充(如果适用)。这是sizeof(char *) + sizeof(int) + sizeof(list_node_t *)
    【解决方案2】:

    我建议常规使用 valgrind(1) 来防止此类问题的发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多