访问结构时出现分段错误

     2023-02-17     45

关键词:

【中文标题】访问结构时出现分段错误【英文标题】:segmentation fault when accesing into a structure 【发布时间】:2014-05-09 22:49:23 【问题描述】:

当我为 level->description 执行 printf 命令时,程序给出了分段错误。我不知道为什么。我应该使用malloc来修复它吗?文件 sokoban.dat 的内容(只有 1 行以 '\n' 结尾)是 "chicago;addie;story started here;-----#####-----------| -----#@$.#------------|-----#####-----------"

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

typedef struct 
char *name;
char *description;
char *password;
char *map;
struct level *next;
//char *solution;
 LEVEL;

LEVEL* parse_level(char *line)    //parsing from file into the structure
    LEVEL level;
    char level_name[50];
    char level_password[50];
    char level_description[100];
    char level_map[200];

    int i = 0;
    int j = 0;
    while (line[i] != ';')       //getting level name
        level_name[j] = line[i];
        i++;
        j++;
    
    level_name[j]='\0';
    level.name=&level_name[0];
    //strcpy(&level.name,level_name);
    //printf("%s\n",level.name);
    printf("%s\n",level_name);
    j = 0;
    i++;
    while (line[i] != ';')      //getting level password
        level_password[j] = line[i];
        i++;
        j++;
    
    level_password[j]='\0';
    level.password=&level_password[0];
    printf("%s\n",level_password);
    j = 0;
    i++;
    while (line[i] != ';')      //getting level description
        level_description[j] = line[i];
        i++;
        j++;
    
    level_description[j]='\0';
    level.description=&level_description[0];
    printf("%s\n",level_description);
    j = 0;
    i++;
    while (line[i] != '\n')     //getting level map
        level_map[j] = line[i];
        i++;
        j++;
    
    level_map[j]='\0';          
    level.map=&level_map[0];
    printf("%s\n",level_map);
    j = 0;
    level.next=NULL;    
    LEVEL* levelPointer=&level;
    return levelPointer;
  
int main()
    FILE *fp = fopen("sokoban.dat", "r");
    if( fp == NULL )
        printf("No such file\n");
        return 1;
    

    char line[500];
    //strcpy(line,"");
    char c;
    int i=0;
    while((c = fgetc(fp)) != '\n') //reading from file 1 by 1 character
       line[i]=c;
       i++;
    
    printf("%s\n",line);
    LEVEL* level;
    level=parse_level(line);
    //printf("%s\n",level->description);   **//!!! this is where error occur**
    printf("%s\n",level->map);

    return 0;

【问题讨论】:

使用诸如 gdb 之类的调试器来准确查找代码中的问题所在,或者注释掉程序的某些部分以缩小故障范围。就目前而言,其他 *** 用户不太可能非常努力地解决您的问题。 problematic 是倒数第 5 行(这是发生错误的时候)。我正在使用 NetBeans 进行调试和变量 level->description 它给了我地址:0x52 . 好的,那里面有 mul 终结器吗? (1)printf("%s\n",line); : line 不是以空结尾的。, (2) while((c = fgetc(fp)) != '\n')...while (line[i] != '\n') line 不包括\n 【参考方案1】:

在函数中,parse_level() 获取所有局部变量的地址并复制到struct 变量level 并返回level。所有这些本地地址的副本以及在其生命周期之后使用这些对象会使您的程序非法并导致undefined behaviour。

在深入研究之前,您应该先阅读语言基础知识并理解指针、数组、函数返回值、返回指针等概念。

与您的问题相关的是:

returning a local variable from function in C

Since I can't return a local variable, what's the best way to return a string from a C or C++ function?

Undefined, unspecified and implementation-defined behavior

Undefined behavior and sequence points

The Definitive C Book Guide and List

【讨论】:

毫无疑问我应该多学习。最好的方法是通过例子学习。我会通过你提供的链接无论如何,Kernighan & Ritchie 的书很难吸收!【参考方案2】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct level 
    char *name;
    char *description;
    char *password;
    char *map;
    struct level *next;
    //char *solution;
 LEVEL;

#if 0
char *strdup(const char *str)
    size_t len = strlen(str);
    char *ret = malloc(len + 1);
    if(ret)
        memcpy(ret, str, len + 1);
        //ret[len] = '\0';
    
    return ret;

#endif

LEVEL* parse_level(char *line) 
    //Returns the allocated memory
    LEVEL *level = malloc(sizeof(LEVEL));
    char *token;
    token=strtok(line, ";");//It cut the string as a separator the ';'.
    level->name = strdup(token);//Copy the memory allocated strings cut out.

    token=strtok(NULL, ";");//Get next token
    level->password = strdup(token);
    token=strtok(NULL, ";");
    level->description = strdup(token);
    token=strtok(NULL, ";");
    level->map = strdup(token);
    level->next = NULL;
#if DEBUG
    printf("debug print : level\n");
    printf("%s\n", level->name);
    printf("%s\n", level->password);
    printf("%s\n", level->description);
    printf("%s\n", level->map);
#endif
    return level;

void LEVEL_free(LEVEL *p)
    free(p->name);
    free(p->password);
    free(p->description);
    free(p->map);
    free(p);


int main()
    FILE *fp = fopen("sokoban.dat", "r");
    if( fp == NULL )
        printf("No such file\n");
        return 1;
    

    char line[500];
    char c;
    int i=0;
    while((c = fgetc(fp)) != '\n') //reading from file 1 by 1 character
       line[i]=c;
       i++;
    
    line[i] = '\0';
    printf("%s\n",line);
    LEVEL* level;
    level=parse_level(line);
    printf("%s\n",level->description);
    printf("%s\n",level->map);

    LEVEL_free(level);//free for malloced memory
    return 0;

【讨论】:

非常感谢您!.....我现在可以继续前进了。我不知道功能strtok()实际上有必要吗? #if 0 char *strdup(const char *str) size_t len = strlen(str); char *ret = malloc(len + 1); if(ret) memcpy(ret, str, len + 1); //ret[len] = '\0'; return ret; #endif @Dounchan ;我写了不是标准函数的示例strdup。如果您的环境中已经存在(在 中),则不需要它。

访问填充了从管道读取的数据的结构时出现分段错误

】访问填充了从管道读取的数据的结构时出现分段错误【英文标题】:Segmentationfaultwhileaccessingstructfilledwithdatareadfrompipe【发布时间】:2011-04-1922:25:08【问题描述】:在尝试访问名为Request的结构时,我一直遇到分段错误,该结构... 查看详情

向结构成员添加值时出现结构分段错误

】向结构成员添加值时出现结构分段错误【英文标题】:Structsegmentationfaultwhenaddingvaluestostructmembers【发布时间】:2021-02-1917:54:57【问题描述】:我在new_session-&gt;sid=sid;遇到分段错误。不知道为什么。伪会话列表.htypedefchar*user;t... 查看详情

访问向量类成员时出现分段错误

】访问向量类成员时出现分段错误【英文标题】:Segmentationfaultonaccessingvectorclassmember【发布时间】:2017-03-1717:34:24【问题描述】:我在C++中的这一行出现分段错误:vector<TemplateElement*>children=getChildren();类That继承自抽象类Templa... 查看详情

为啥在访问二级指针时出现分段错误错误? C语言

】为啥在访问二级指针时出现分段错误错误?C语言【英文标题】:Whyamigettingsegmentationfaulterrorwhileaccessingasecondlevelpointer??Clanguage为什么在访问二级指针时出现分段错误错误?C语言【发布时间】:2021-06-2102:18:43【问题描述】:以下... 查看详情

将结构插入地图时出现分段错误

】将结构插入地图时出现分段错误【英文标题】:Segmentationfaultwheninsertingstructintoamap【发布时间】:2021-12-1701:14:45【问题描述】:正在填充的mapBase参数将代表一个坐标系。我使用std::map轻松地根据x排序坐标,然后配对到由内部地... 查看详情

访问共享内存时出现分段错误

】访问共享内存时出现分段错误【英文标题】:SegmentationFaultwhileacessingsharedmemory【发布时间】:2019-07-3111:25:25【问题描述】:我想为我的应用程序使用共享内存。我有两个过程。一个将创建共享内存(写入器),另一个将附加到... 查看详情

访问共享进程内存时出现分段错误(核心转储)

】访问共享进程内存时出现分段错误(核心转储)【英文标题】:Segmentationfault(coredumped)whenaccessingsharedprocessmemory【发布时间】:2019-05-0217:06:52【问题描述】:我试图让两个子进程将两个随机整数写入共享内存,然后让父进程读... 查看详情

删除以结构为键的地图时出现分段错误

】删除以结构为键的地图时出现分段错误【英文标题】:segmentationfaultwhendeletingamapwithstructbeingthekeys【发布时间】:2012-02-2915:51:10【问题描述】:在我的代码中,我有一个用作映射键的结构:structindexintx;inty;intz;booloperator<(constin... 查看详情

发送具有 std::vector 成员的结构时出现分段错误

】发送具有std::vector成员的结构时出现分段错误【英文标题】:Segmentationfaultwhensendingstructhavingstd::vectormember【发布时间】:2017-02-2510:14:30【问题描述】:为什么我使用mpirun-np2./out命令得到以下代码的以下错误?我在调整std::vector... 查看详情

当我在 C++ 中使用结构创建节点时出现分段错误

】当我在C++中使用结构创建节点时出现分段错误【英文标题】:IgetasegmentationfaultwhenIcreateanodewithastructinc++【发布时间】:2015-06-1300:51:05【问题描述】:我使用以下结构作为堆的节点structNodeintk;*p,**array;然后我创建了一个类,它是... 查看详情

删除时出现分段错误

...:26【问题描述】:我是C++的新手,我正在尝试实现一个树结构,但我遇到了一个分段错误,该错误在删除树时出现。这段代码很简单,我有一个Node类,其中包含指向其子节点的指针。#include<vector>classNodepublic:intdata1,data2;std::v... 查看详情

c中的memset struct数组时出现分段错误

...布时间】:2017-05-1904:24:24【问题描述】:我正在尝试清空结构数组中的所有数据。但事实证明是分段错误。谁能帮帮我。结构structentrycharuser;charname[9];charextension[4];shortblockcount;shortblock[8] 查看详情

创建列表时出现分段错误

...间】:2021-12-1004:41:04【问题描述】:我正在创建一个新的结构列表,我将在其中保存有关一系列汽车的一些信息。我编译代码没有问题,但是一旦我运行它就会出现分段错误。这是问题所在的代码:car*insertNode(car*head)car*temp;car*pr... 查看详情

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误

】在C++中使用指针的数组:访问返回的数组时出现分段错误【英文标题】:arraysusingpointersinc++:segmentationfaultwhenaccessingthereturnedarray【发布时间】:2016-11-2817:06:12【问题描述】:我是C++新手,我正在尝试使用指向指针的指针构建一... 查看详情

创建邻接列表时出现分段错误

...发布时间】:2012-11-0813:47:17【问题描述】:我正在为图形结构创建一个邻接列表。下面是我的代码sn-p当我在gdb中运行时,给出“程序收到信号SIGSEGV,分段错误。std::_List_node_base::hook()中的0x0040340f”错误。有人可以指出代码中的... 查看详情

分配时出现分段错误[重复]

】分配时出现分段错误[重复]【英文标题】:segmentationfaultwhenallocating[duplicate]【发布时间】:2020-05-1310:20:22【问题描述】:我遇到了分段错误,希望能帮助我了解我做错了什么。在我的代码运行一段时间后,我收到了一个核心转... 查看详情

创建 VertexArray 时出现分段错误

】创建VertexArray时出现分段错误【英文标题】:SegmentationfaultwhencreatingVertexArray【发布时间】:2017-06-0215:33:05【问题描述】:当我调用glGenVertexArrays()时出现分段错误。我尝试设置glewExperimental=GL_TRUE,但仍然收到错误消息。这是我... 查看详情

使用 MATLAB mex 将向量与另一个向量分配时出现分段错误

...现错误的地方:C[check].S=vector<int>(S1);endC是一个全局结构数组,定义为:typedefstructC_typ 查看详情