c - ANSI C - 程序接收信号 SIGSEGV,段错误

标签 c segmentation-fault ansi-c

我使用 ANSI C 并收到“程序收到信号 SIGSEGV,段错误”。当我运行下面的代码时。编译没问题。没有错误。

#define MAX_LINE_SIZE 1024
#define DELIMITER ","
#define TICKET_NAME_LEN 40
#define TICKET_ZONE_LEN 10

struct stock_data 
{
    char ticket_name[TICKET_NAME_LEN+1];
    char ticket_type;
    char ticket_zone[TICKET_ZONE_LEN+1];
    unsigned int ticket_price;
    unsigned int stock_level;
};

typedef struct stock_node 
{
    struct stock_data * data;
    struct stock_node * next_node;
} stock_node;

char temp_line[MAX_LINE_SIZE];
char *token;
int i, count = 0;

stock_node * snode = NULL;
struct stock_data * sdata = NULL;

FILE *stock_file = fopen( stockfile, "r" );

while (fgets(temp_line, MAX_LINE_SIZE, stock_file) != NULL) {

  token = strtok (temp_line, DELIMITER);
  count++;

  snode = (stock_node *) realloc(snode, count * sizeof(stock_node));
  if (snode == NULL) { abort(); }  

  snode->data = (struct stock_data *) malloc(sizeof(struct stock_data));
  if (snode->data == NULL) { abort(); }  

  i = 1;

 while(token != NULL) {
     switch(i) {
        case 1:
           strcpy(snode[count - 1].data->ticket_name, token);
           break;
        case 2:
           snode[count - 1].data->ticket_type = token[0];
           break;
        case 3:
           strcpy(snode[count - 1].data->ticket_zone, token);
           break;
        case 4:
           snode[count - 1].data->ticket_price = atoi(token);
           break;
        case 5:
           snode[count - 1].data->stock_level = atoi(token);
           break;                                                            
     }

     token = strtok (NULL, DELIMITER);
     i++;
  }
}

我使用gdb工具来调试它,我发现我收到以下几行的错误:(对于其中的任何一行。我尝试逐一禁用它们,每个都导致段错误。)

strcpy(snode[count - 1].data->ticket_name, token);
snode[count - 1].data->ticket_type = token[0];
strcpy(snode[count - 1].data->ticket_zone, token);
snode[count - 1].data->ticket_price = atoi(token);
snode[count - 1].data->stock_level = atoi(token);

最佳答案

嗯,看起来snode[count - 1].data从未初始化过。仅分配第一个索引snode[0].data

我认为你应该更换

snode->data = (struct stock_data *) malloc(sizeof(struct stock_data));
if (snode->data == NULL) { abort(); }

snode[count - 1].data = (struct stock_data *) calloc(1, sizeof(struct stock_data));
if (snode[count - 1].data == NULL) { abort(); }

关于c - ANSI C - 程序接收信号 SIGSEGV,段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19767960/

相关文章:

c - MPI:程序工作取决于进程数

c - *(a+b) 和 (*a+b) 有什么区别

c++ - 预期的 ;在顶级声明符之后,xcode中的错误

c++ - VS2008中一个奇怪的双重计算

当数据复制/扫描/读取到未初始化的指针时崩溃或 "segmentation fault"

c - C 中的二叉搜索树 SEGFAULT

c++ - 简单 C++ 程序中的段错误

c - 安西C : factorial function wrong a

c - 动态分配扫描失败数量

c - 多个线程写入同一个文件