Как я могу предотвратить ошибки сегментации в моей программе? - PullRequest
0 голосов
/ 16 апреля 2010

У меня есть назначение на C. Это намного длиннее, чем код, показанный ниже, и нам даны только прототипы функций и инструкции. Я сделал все возможное при написании кода, но я застрял с ошибками сегментации. Когда я компилирую и запускаю приведенную ниже программу в Linux, при «735 NaN» она прекращается, указывая на то, что произошла ошибка. Зачем? Что я делаю неправильно? По сути, программа не позволяет мне получить доступ к ключу table-> list_array [735] -> value и table-> list_array [735] ->. Это, конечно, первый сегмент. Может быть больше следующего индекса 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;
}

Ответы [ 2 ]

2 голосов
/ 16 апреля 2010

Вы указываете ptr->list_array на локальную переменную (nodes) в table_allocate, которая исчезает, когда эта функция возвращается, оставляя висячий указатель. Вы, вероятно, хотите

list_node_t **nodes = malloc(size * sizeof(list_node_t *));
1 голос
/ 16 апреля 2010

Я рекомендую регулярное использование valgrind (1) для предотвращения возникновения таких проблем.

...