2014-02-21 5 views
0

왜 내 코드가 세그먼트 오류를 ​​발생시키는 지 알 수 없습니다. 잘 작동하기 전에 무엇인가 했어야했는데 무엇을해야할지 모르겠다.코드가 세분화 오류를 발생시킵니다.

이 함수는 파일 의 특정 라인으로부터 어떤 마크 다운 요소를 얻고,이 문제는 아래 함수 발생 요소

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; 
} 

와 동적 배열 (INT * 요소)를 반환한다.

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]; 

나에게 세그먼트 오류를 ​​제공하고 그 이유를 모른다. 이 줄 뒤에 프로그램이 중지됩니다.

이이 코드는

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; 

는 SB 수 parser.h에서 추출 된 주요 프로그램

#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; 
} 

입니다. 내가 뭘 잘못했는지 말해 줄래? 감사합니다.

+0

음, 어디 parser_printMDElements''에 대한 호출은 다음과 같습니다 즉 실제로 경우라면

, 당신은 함께 md->value->string = argv[1];를 대체하여 그것을 해결할 수 있습니까? 'List'의 타입 정의는 어디에 있습니까? 'markdown'의 초기화는 어디에 있습니까? –

+0

나는 내 게시물을 적절히 편집했습니다. – user3337413

답변

0

아직 코드가 누락되어 있습니다.

귀하의 문제는 아마도 md->value->string = argv[1];에있는 것으로 생각됩니다.

(귀하의 질문에 md->value->string의 사용 방법이 표시되어 있지 않지만).

md->value->string이 가리키는 메모리 내용을 변경하려고하면이 변수가 읽기 전용 메모리 세그먼트를 가리키고 있기 때문에 메모리 액세스 위반이 발생합니다.

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

솔루션을 사용해 보았지만 여전히 seg 오류가 발생합니다. – user3337413

+0

내가 말했듯이, 당신의 코드에는 많은 부분이 빠져 있습니다. 예를 들어'md-> value-> string'이 어디에서 사용되고 있는지를 보여주지 않습니다. 그래서 내가 말한 모든 것은 (위의 대답 포함) 단순한 추측 일 것입니다. 질문 내에서 적절하게 정렬 된 모든 관련 코드를 제공해야합니다. –

관련 문제