0

関数を使用して構造体内に配列を構築し、それを出力する必要がある演習で、私は数時間困惑しました。私の現在のプログラムでは、コンパイルはできますが、実行時にクラッシュします。

#define LIM 10

typedef char letters[LIM];

typedef struct {
    int counter;
    letters words[LIM];
} foo;


int main(int argc, char **argv){
    foo apara;
    structtest(apara, LIM);
        print_struct(apara);

}

int structtest(foo *p, int limit){
    p->counter = 0;
    int i =0;
    for(i; i< limit ;i++){
        strcpy(p->words[p->counter], "x");
                //only filling arrays with 'x' as an example
        p->counter ++;
    }
    return;

ポインターの間違った使用法/組み合わせが原因だと思います。それらを調整しようとしましたが、「互換性のない型」エラーが発生するか、配列が空白のように見えます

}

void print_struct(foo p){
    printf(p.words);

}

print_struct の段階まではうまくいきませんでしたが、 p.words が呼び出すのに適切な項目かどうかはわかりません。出力では、関数が x の配列を返すことが期待されます。「これはもう知っているはずだ」という重大な間違いを犯してしまった場合は、あらかじめお詫び申し上げます。ご協力いただきありがとうございます。

4

2 に答える 2

1

structest() の最初のパラメーターは、型 foo のポインターとして宣言されます。

int structtest(foo *p, int limit)

メインでは、foo 変数へのポインターを渡すのではなく、foo 変数を渡すだけです。

structtest(apara, LIM);

次のように foo 変数にポインターを渡してみてください。

structtest(&apara, LIM);
于 2012-09-22T03:23:33.347 に答える
0
void print_struct(foo p){
    printf(p.words);

}

print_structの段階まではうまくいきませんでしたが、p.wordsが正しい呼び出し項目であるかどうかはわかりません。出力では、関数がxの配列を返すことを期待します。なんらかの悲惨な「もう知っておくべき」Cミスをしてしまったら、事前にお詫び申し上げます。ご協力いただきありがとうございます。

他の言語で配列を印刷する方法であるprintfに配列を送信することはできません。あなたは自分でループをしなければなりません:

void print_struct(foo paragraph)
{
   printf("counter: %d\n",paragraph.counter);
   for (int i = 0; i < paragraph.counter; i++)
   {
      printf("words[%d] %s\n",i,paragraph.words[i]);
   }
}

main()関数をソースコードの最後に移動する必要があります。または、mainの下、mainの上に定義されているコードの関数プロトタイプを追加する必要があります。

int structtest(foo *p, int limit);
....
main()
{
...
}
int structtest(foo *p, int limit)
{
...
}
于 2012-09-22T03:33:37.187 に答える