2017-10-16 15 views
1

テキストファイルを解析してポインタ配列に格納するプログラムがあります。私には1つの問題しかありません。 char **オブジェクトに文字列の配列を格納しようとしていますが、char **に値を割り当てるたびに、segフォルトが発生します。char ** segフォールディングへの値の割り当て

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

char **get_values(int recipe_num, char *file) { 
    int placehold_num=recipe_num; 
    char *text=parse_recipes(file); 
    int num_recipes=count_recipes(file); 
    char **array_strings; 
    int index=-1; 
    for (int i=0;*(text+i)!='\0';i++) { 
     if (*(text+i)=='R' && *(text+i+1)=='e' && *(text+i+6)==':' && (text+i+7)==' ') { 
      i+=13; 
      index++; 
      for (int j=0;*(text+i+j-1)!='\n';j++) { 
       printf("%c",*(text+i+j)); 
       *(*(array_strings+index)+j)=*(text+i+j); 
      } 
     } 

    } 

} 

これは私が*(text+i+j)から必要な文字を出力しますが、次の行に障害をSEG。私はそれが呼び出されている別の関数で問題ではないことを非常に確信しています、私はarray_stringsを逆参照している方法で何かでなければならないと思います。どんな助けでも大歓迎です。

+1

[mcve]を投稿してください。デバッガから何を伝えましたか? – melpomene

+1

'array_strings'がポイントするメモリを割り当てたことはありません。 – Barmar

+1

'text + i + j'は2次元配列の要素にアクセスする正しい方法ではありません。 'text + i * row_size + j' – Barmar

答えて

1

問題それは今、いくつかのゴミを指しているあなたは、変数

char** array_strings; 

を作成

*(*(array_strings+index)+j)=*(text+i+j); 

である、あなただけの

print("%p\n", array_strings); 

を呼び出すことにより、現在のアドレスを見ることができますarray_stringsNULLで初期化することを強くお勧めします。あなたが書き込むことができるメモリへのポインタを呼び出すと、あなたの他のデータが格納されている場所に書き込んで、両方のデータを破棄します。 NULLの場合は、常にsegfaultが表示されます。したがって、現時点では、メモリ内のランダムな場所に値*(text+i+j)を割り当てようとしています。行うには

、何をしたい、あなたは

nはあなたが必要とする文字列の量であり、その後のサイクルで

array_strings[some_your_index] = text+i+j; 

array_strings[some_your_index]text+i+jとして、今char*あるん

char** array_strings = (char**)malloc(n * sizeof(char*)); 

に持っていますです。

+0

参照:[** mallocの結果をキャストしますか?**](http://stackoverflow.com/q/605845/995714)' char ** array_strings = malloc(sizeof * array_strings); 'で十分です。次に、各文字列に割り当てる必要があります。 'array_strings [i] = malloc(strlen(str)+ 1);' –

+0

この記事をありがとう、本当に面白いです。私は 'char *'ポインタを使用して、古い文字列の中で '\ 0'などで区切られた文字列を指すことができます。また、私にとっては 'sizeof char *'よりも 'sizeof * array_strings'を読むのが難しく、そのように書くのは問題ではないと思います – Alex

関連する問題