核心转储分段错误[关闭]

Posted

技术标签:

【中文标题】核心转储分段错误[关闭]【英文标题】:core dumped segmentation fault [closed] 【发布时间】:2020-08-11 07:47:57 【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

typedef struct student
   char name[25];
   float marks;

student_t;

int size = 0;
int capacity = 2;


char filename[30];
#define LINE_SIZE 128

void print(student_t **arr)
    for (int i = 0; i < size; i++)
        printf("%d: %s, %f\n", i+1, arr[i]->name, arr[i]->marks);
    


int create_table_entry(student_t **arr, int *size, int *capacity)
     //printf("%d",size);
     if( *size == *capacity) 
         *capacity = *capacity * 2;
         *arr = realloc (*arr, *capacity * sizeof(student_t));
     
     return 0;


void add_record(student_t **arr, char *name, char *marks)
    create_table_entry(arr,&size ,&capacity);
    strcpy(arr[size]->name, name);
    arr[size]->marks = atof(marks);
    size++;
    //print(arr);


int get_token(char *line, char fields[][30], char *delim) 
    int token_cnt = 0;
    char *token = strtok(line , delim);
    while(token != NULL) 
        // check if there is more than two tokens
        if(token_cnt >= 2) 
            return 3;
        
        //printf("%s\n", token);
        strcpy(fields[token_cnt++], token);
        // update token
        token = strtok(NULL, delim);
    
    return token_cnt;


static void sort_data()
   // printf("reading the file ...........");
   FILE *fileOpen = fopen( filename , "r");
   if (fileOpen == NULL)
       fprintf(stderr, "Error in opening input file. Filename = %s, Error = %s\n", filename, strerror(errno));
       exit (-1);
   
   char line[LINE_SIZE];
   char fields [2][30];
   student_t *arr;
   arr = malloc(capacity * sizeof(student_t));
   while(fgets(line, LINE_SIZE, fileOpen) != NULL)
         int no_of_token = get_token(line, fields, ",");
        // printf("%d\n",no_of_token);
         if(no_of_token != 2)
              //printf(" number of fields is not 2 for entry %d",j);
              continue;
         
         add_record(&arr,fields[0],fields[1]);
         //printf("%s \n %s",fields[0],fields[1]);      
   
   print(&arr);
   free(arr);


void check_argument(int argc,char *argv[])
   int count =0;
   for(int i=1; i<argc; i++)
      if(strstr("-f",argv[i]))
        sprintf(filename,"%s",argv[i+1]);
        count++;
      
   
   if(count>1||count<1)
        printf("invalid format");
   
   //printf("%s\n",filename);


int main(int argc, char *argv[])
   check_argument(argc, argv);
   sort_data();
   return 0;

在上面的程序中,我要做的是打开一个 (.csv) 文件,逐行读取它,然后将这些行传递给 get_token 函数,以便生成令牌,我只想要那些有 2 个字段的行我还想获取这两个标记的值,以便我可以将它传递给 add_record 函数并创建一个动态结构数组,以便我可以对其进行排序并将其存储在其他文件中。但是我没有在文件中获取学生记录的值,而是在我运行它时的输出显示核心转储。所以请帮我解决这个问题,因为我是 c 编程新手。如果我的代码伤害了你的眼睛,也很抱歉

【问题讨论】:

欢迎来到 Stack Overflow!您发布的代码似乎比对您的问题合理的代码更多。请阅读How to Ask 以及如何制作minimal reproducible example;提供 MRE 可以帮助用户回答您的问题,并且未来的用户会与您的问题相关。 idownvotedbecau.se/nomcve What is a debugger and how can it help me diagnose problems? 和 How to debug small programs strcpy(arr[size]-&gt;name, name); 代码将arr 视为一个指针数组。但它实际上是一个指向数组的指针。它们是不同的东西。正确的访问方式是(*arr)[size].name Saransh,我建议您使用更短、更中肯的代码来编辑您的问题,并将您要说的内容分成几个简短的段落,这些段落也很中肯.这是为了您的利益,因为您的代码越容易阅读和理解,我们就能越快地为您提供帮助。此外,许多有经验的用户浏览时可能会看到你的问题,但由于可读性差而跳过它。只是想指导你,因为你的新人。 *arr = realloc (*arr, ... 你不应该直接将realloc 的结果重新分配给传递给函数的同一个指针。 realloc 可能会返回 NULL,你会丢失指针。另外,当然,您应该检查NULL 的所有分配函数的结果。 【参考方案1】:

这部分

void print(student_t **arr)
    for (int i = 0; i < size; i++)
        printf("%d: %s, %f\n", i+1, arr[i]->name, arr[i]->marks);
    

有问题。你传递了一个指向student_t的指针,所以当你索引它时,它期望它是一个指向student_t的数组。但实际上你有一个 student_t 数组。

试试:

void print(student_t *arr)
    for (int i = 0; i < size; i++)
        printf("%d: %s, %f\n", i+1, arr[i].name, arr[i].marks);
    

并称之为:print(arr);

编辑:正如@kaylum 在评论中指出的那样,您在这里遇到了同样的问题:

strcpy(arr[size]->name, name);
arr[size]->marks = atof(marks);

【讨论】:

以上是关于核心转储分段错误[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥在编译我的代码C(linux)时出现分段错误(核心转储)[关闭]

代码分段错误(核心转储)pthread创建[关闭]

获取“分段错误核心转储”

分段错误(核心转储)

运行我的代码时出现分段错误(核心转储)问题

pyqt5 中的分段错误(核心转储)