【问题标题】:Code give me segmentation fault代码给我分段错误
【发布时间】:2014-03-23 02:12:27
【问题描述】:

我不知道为什么我的代码会出现分段错误。 在它工作正常之前,所以我必须对它做了些什么, 但我不知道是什么。

此函数从文件中的特定行获取一些 Markdown-Elements 并返回一个包含元素的动态数组( int * 元素)

int * parser_getElements(char * string)
{

int * elements;

char * token, * temptoken;
int charcount = 0, elemcount = 1, i = 0;

assert(string != NULL);

elements = malloc(sizeof(int));
*elements = 0;

token = strtok(string," ");

while(token != NULL)
{
    temptoken = token;
    while (*temptoken)
    {
        charcount++;
        ++temptoken;
    }

    if(token[0] == '*' && token[charcount - 1] == '*')
    {

        if(token[1] == '*' && token[charcount - 2] == '*')
        {
            elements[elemcount-1] = EMPH;
        }
        else
        {
            if(token[1] != '*' && token[charcount - 2] != '*')
            {
                elements[elemcount-1] = ITAL;
            }
        }
        elemcount++;
        elements = realloc(elements,sizeof(int) * elemcount);
    }
    else if(token[0] == '_' && token[charcount - 1] == '_')
    {

        if(token[1] == '_' && token[charcount - 2] == '_')
        {
            elements[elemcount-1] = EMPH;
        }
        else
        {
            if(token[1] != '_' && token[charcount - 2] != '_')
            {
                elements[elemcount-1] = ITAL;
            }
        }
        elemcount++;
        elements = realloc(elements,sizeof(int) * elemcount);
    }

    else
    {
        elements[elemcount-1] = TEXT;
        elemcount++;
        elements = realloc(elements,sizeof(int) * elemcount);
    }

    token = strtok(NULL, " ");
    charcount = 0;
}

return elements;
}

问题出现在下面的函数中。

void parser_printMDElements(List markdown, FILE * out)
{
MD_Element element;
int count = 0, no_text = 0;

if(markdown != NULL)
{

    element = markdown->value->elements[0];

    while(element <= EMPH)
    {
        if(element > TEXT)
        {
            no_text = 1;
        }
        count++;
        element = markdown->value->elements[count];
    }

    count = 0;
    element = markdown->value->elements[0];

    while(element <= EMPH)
    {
        if(no_text)
        {
            printf("%s\n",MD_Element_Descr[element]);
        }
        count++;
        element = markdown->value->elements[count];
    }

    parser_printMDElements(markdown->next,out);
}
}

这一行(首次出现)

element = markdown->value->elements[0];

给我一​​个分段错误,我不知道为什么。 程序在这一行之后停止。

这是主程序

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "errors.h"
#include "parser.h"

int main(int argc, char * argv[])
{

Errorcode error = ERR_NULL;
char * gap;
int gapcount = 1;
List md = parser_newList();

/** Save name of document in firstnode */
md->value = malloc(sizeof(struct NodeValue));
md->value->string = argv[1];
md->type = DOCUMENT;

md->next = malloc(sizeof(struct Node));

error = parser_parseFile(argv[1],&(md->next));
if(error == ERR_NULL)
{
    gap = malloc(sizeof(char));
    *gap = '\0';
    parser_printMDElements(md, gap, gapcount, stdout);
    printf("\n");
}

return 0;
}

这段代码是从 parser.h 中提取的

enum MD_Element
{
    DOCUMENT,
    LINE,
    SECTION,
    LISTELEMENT,
    H1,
    H2,
    H3,
    H4,
    H5,
    H6,
    TEXT,
    IMG,
    LINK,
    QUOTE,
    CODE,
    ITAL,
    EMPH
};    

typedef enum MD_Element MD_Element;

typedef struct NodeValue * NodeValue;

struct NodeValue
{
    char * string;
    int * elements;
};

typedef struct Node * Node;

struct Node
{
    MD_Element type;
    NodeValue value;
    Node next;
};

typedef Node List;

可以某人。告诉我我做错了什么? 谢谢!

【问题讨论】:

  • 那么,parser_printMDElements 的电话在哪里? List的类型定义在哪里? markdown的初始化在哪里?
  • 我相应地编辑了我的帖子

标签: c segmentation-fault


【解决方案1】:

这里仍然缺少很多代码。

我猜你的问题可能出在md-&gt;value-&gt;string = argv[1];

(尽管您的问题并未显示您如何使用md-&gt;value-&gt;string)。

如果您尝试更改md-&gt;value-&gt;string 指向的内存内容,那么您将遇到内存访问冲突,因为此变量指向只读内存段。

如果确实如此,那么您可以通过将md-&gt;value-&gt;string = argv[1]; 替换为:

md->value->string = malloc(strlen(argv[1])+1);
strcpy(md->value->string,argv[1]);

【讨论】:

  • 我已经尝试了你的解决方案,但我仍然遇到 seg 错误。
  • 正如我所说,您的问题中缺少许多代码。例如,它不显示md-&gt;value-&gt;string 的使用位置。所以我告诉你的一切(包括上面的答案)都只是猜测。您需要提供所有相关的代码,并在问题中正确排序。
猜你喜欢
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
相关资源
最近更新 更多