0

何らかの理由で、このテスト コードを実行しようとすると、セグメンテーション エラーが発生します。プログラムは、ファイルから文字列を読み取り、それらを配列に入れることになっています。私は C が初めてで、デバッガーを使用してみましたが、問題が発生しています。

任意の入力をいただければ幸いです。

void fillArray(char *array[], int * count, FILE * fpin){    

char buf[40];
char *p;
count = 0;
while(fgets(buf, 40, fpin) != NULL){
    if((p= strchr(buf, '\n')) != NULL)
    *p = '\0'; //step on the '\n' 
    array[(*count)++] = malloc(strlen(buf)+1);
    assert(array[*count]);
    strcpy(array[*count], buf);
    (*count)++;
}
}
4

2 に答える 2

1
array[(*count)++] = malloc(strlen(buf)+1);
              ^^^
assert(array[*count]);

最初にインクリメントしてから、配列内の次の位置、おそらく初期化されていないポインターを使用します。その行から をドロップし++ます。

于 2013-03-14T20:54:21.973 に答える
0

これが役立つことを願っています。この関数は、配列および配列エントリのメモリを自動的に管理します。

void fillArray(char ***array, int *count, FILE *fpin)
{
    char *tmp[] = 0;
    int tmp_allocated = 0;
    int tmp_count = 0;

    assert(array);
    assert(count);
    assert(fpin);

    while(fgets(buf, 40, fpin) != NULL)
    {
        if (( p= strchr(buf, '\n')) != NULL)
        {
            *p = 0;
        }
        if (tmp_count == tmp_allocated)
        {
            tmp_allocated += 10;
            tmp = realloc(tmp, sizeof(char*) * tmp_allocated);
            assert(tmp);
        }
        tmp[tmp_count] = strdup(buf);
        assert(tmp[tmp_count]);
        tmp_count++;
     }

     *array = realloc(tmp, sizeof(char*) * tmp_count);
     *count = tmp_count;
}

そして、ここでそれをどのように使用できますか。

void userOfFillArray()
{
    int count;
    char **array;
    FILE *fpin = ...;

    fillArray(&array, &count, fpin);
    // if count == 0, then array can be NULL

    ...

    while (count--)
    {
       free(array[count]);
    }
    free(array);
}
于 2013-03-14T22:17:02.630 に答える