2017-12-11 27 views
0

私のプログラムを実行すると、どこかでセグメンテーションフォールトが発生しているようですが、テストを実行したところ、見つからないようです。私はgcc -Wall -Werror -std = c99 -Oを使ってコンパイルしています。seg faulting textbuffer newTB

タスクは、 "\ n"で区切ってリンクリストに入れるTB newTBでテキストバッファを作成することです。

test = newTB("hello\ngood bye\nworld\n"); 
[hello]->[good bye]->[world] 

それは私はそれが障害をSEGするために引き起こして見逃している何かである必要がありますので、これは現在、現時点で唯一の機能です。

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

#include "textbuffer.h" 

struct textbuffer { 
    char *text; 
    int length; 
    TB next; 
}; 

void printBuffer(TB tb); 

TB newTB (char text[]){ 
    if (text == NULL) { 
     printf("buffer underflow\n"); 
     abort(); 
    } 

    TB new = calloc(1, sizeof(struct textbuffer)); 
    new->length = 0; 
    new->next = NULL; 
    TB current = new; 

    char *token; 
    int size; 

    //first token; intialise first. 
    token = strtok(text, "\n"); 
    size = strlen(token); 
    current->text = calloc(size + 1, sizeof(char)); 
    strcpy(current->text, token); 
    //use memset to add a NULL terminator at the end. 
    memset(current->text, '\0', size + 1); 
    new->length++; 
    current->next = NULL; 



    int count = 0; 
    while (token != NULL) { 
     //first linked list already done, do nothing for the first loop. 
     if (count == 0) { 

     } else { 
      //create next textbuffer and fill it with the token. 
      current->next = calloc(1, sizeof(struct textbuffer)); 
      current = current->next; 
      size = strlen(token); 
      current->text = calloc(size + 1, sizeof(char)); 
      strcpy(current->text, token); 
      memset(current->text, '\0', size + 1); 

      new->length++; 
     } 

     count++; 
     token = strtok(NULL, "\n"); 
    } 

    current->next = NULL; 


    return new; 
} 
+0

使用すると、 'が代わりにcalloc''のmalloc'。 –

+1

'memset(current-> text、 '\ 0'、size + 1);'は文字列全体をゼロに設定します。あなたが望むものではありません。 'strcpy'はそれを取り除くことができます(私は' strdup'を使用しました) –

+1

デバッグ版をビルドします(ビルド時に '-O'フラグを落として' -g'フラグを追加します)。あなたのプログラムをデバッグする](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

答えて

0

問題はstrtok関数にあります。 この投稿に記載されている通り:
C's strtok() and read only string literals
strtok関数は文字列を変更するため、文字列リテラルでは機能しません。
だけ試してください:あなたはとにかくそれを初期化しているよう

char str[] = "hello\ngood bye\nworld\n"; 
test = newTB(str); 
関連する問題