0

私はメモリの動的について学び、実験を行いましたが、それでも行き詰まります。すでにいくつか検索しましたが、結果は得られませんでした。

これは私の簡単なコードです:

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

    typedef struct kata kata;
    struct kata {
        char string[256];
    };

void load(kata **data)
{
        int len = 0;

        while( len < 5 ) {


            (*data) = (kata *) realloc ((*data), (len + 1) * sizeof(kata));
            printf("copy A - %d\n", len);

            strcpy(data[len]->string, "A");
            len++;
        }
        getch();
}

int main() {    
    kata *data = NULL;

    load(&data);

}

そして私の質問は、デバッグ時に常にセグメンテーション違反(3)になるのはなぜですか?

アドバイスありがとうございます

編集 :

エラーが発生する理由はまだわかりませんが、今すぐ解決策を見つけました..

data[len]->string を (*data)[len].string に変更するだけです

data[len]->string と呼ぶ理由は何ですか?

4

3 に答える 3

1

data[len]->stringする必要があります(*data)[len]->string (*data)[len].string

于 2012-05-27T07:49:07.020 に答える
0

なぜコードが機能しなかったのかわかりません。私は同様の例を試しましたが、うまくいきました。

int main(void)
{
  int *ptr = NULL;

  ptr=(int *) realloc(ptr, 1*sizeof(int)); cout<<"1"<<endl;
  ptr=(int *) realloc(ptr, 2*sizeof(int)); cout<<"2"<<endl;
  ptr=(int *) realloc(ptr, 3*sizeof(int)); cout<<"3"<<endl;
  ptr=(int *) realloc(ptr, 4*sizeof(int)); cout<<"4"<<endl;
  ptr=(int *) realloc(ptr, 5*sizeof(int)); cout<<"5"<<endl;
  return 0;
}

私はあなたのコードを実行しようとしました。strcpyラインに問題が発生しています。その行をコメントアウトすると。正常に動作します。

data[len]->stringが正しい答えを返すようになりました。ここでは、*dataの配列をmallocしました。したがって、これを行う正しい方法はstrcpy((* data)[len] .string、 "A")です。文字列を逆参照するために、矢印演算子の代わりにドット演算子を使用していることに注意してください。

于 2012-05-27T08:37:46.340 に答える
0

while ループ自体の 2 回目の繰り返しで strcpy を使用すると、アクセス違反が発生するはずです。2回目はどのように動作し、3回目はエラーが発生するのだろうか。誰かが私にそれを説明してくれたら、私はもっとうれしいです.

于 2012-05-27T09:18:37.383 に答える