c中的核心转储和动态内存分配

Posted

技术标签:

【中文标题】c中的核心转储和动态内存分配【英文标题】:core dumped and dynamic memory allocation in c 【发布时间】:2020-11-28 09:21:37 【问题描述】:
static int get_token(char *line, char fields[2][30], char *delim)
   char *token = strtok(line , delim);
   int flag = 0;
   while (token != NULL) 
        //printf("%s\n", token); 
        token = strtok(NULL, delim);
        if (flag == 0)
            strcpy(fields[flag], token);
        else if(flag == 1)
            strcpy(fields[flag], token);
   
   return flag;


static void sort_data()
   // printf("reading the file ...........");
   FILE *fileOpen = fopen( filename , "r");
   char line[LINE_SIZE];
   char fields [2][30];
   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;
         
   printf("%s \n %s",fields[0],fields[1]);
   

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

【问题讨论】:

首先,您的 get_token 函数始终返回 0。如果您想返回已解析的令牌数,则需要在令牌化循环内增加标志变量。在没有测试数据的情况下很难知道程序为什么会崩溃,但很可能是因为“标志”从不增加,所以字符串永远不会复制到字段 [1] 中,并且您尝试 printf 未初始化的内存。一个建议是删除最终打印以确保是导致崩溃的代码,和/或将 printf 分成单独的部分,以查看它是否打印字段 [0] 但打印字段 [1] 崩溃。 【参考方案1】:

您的代码中有一些错误。我已经修好了那些。只需比较两个代码文件,您就可以了解您的代码有什么问题。大多数情况下,您放错了行,无法编写正确的算法等...

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


#define LINE_SIZE 1024


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;



void sort_data() 
    static char line[LINE_SIZE];
    static char fields [2][30];

    char *input = "input.csv";

   // printf("reading the file ...........");
    FILE *fp = fopen(input, "r");
    if(fp == NULL) 
        printf("error: can't open file\n");
        exit(1);
    

    while(fgets(line, LINE_SIZE, fp) != NULL) 
        int no_of_token = get_token(line, fields, ",");
        
        printf("no_of_token: %d\n", no_of_token);

        if(no_of_token != 2) 
            // printf(" number of fields is not 2 for entry %d",j);
            printf("no_of_token is not 2...:(\n\n");
            continue;
        
        printf("first-elem: %s \nsecond-elem:%s\n",fields[0],fields[1]);
    

    fclose(fp);


int main() 

    sort_data();

    return 0;

input.csv:

A,B
C,D
X,Y
P,Q,R
U,V

输出:

no_of_token: 2
first-elem: A
second-elem:B

no_of_token: 2
first-elem: C
second-elem:D

no_of_token: 2
first-elem: X
second-elem:Y

no_of_token: 3
no_of_token is not 2...:(

no_of_token: 2
first-elem: U
second-elem:V

注意:如果元素少于或多于 2 个,您也可能会抛出错误...这是您的选择

【讨论】:

以上是关于c中的核心转储和动态内存分配的主要内容,如果未能解决你的问题,请参考以下文章

c和c ++中的动态内存分配和堆有啥区别

堆区的动态内存分配

C语言中的动态内存分配的用法举例

C++11 中的动态对齐内存分配

C语言学习笔记--动态内存分配

C语言之动态内存管理(动态内存分配+经典笔试题+柔性数组)[建议收藏]