0

ファイルを1行ずつ1つの文字列にロードし、次にこのコードを使用してmemcpyのこの文字列を別の文字列ポインターにロードするCプログラムがあります。

   typedef struct inmod_struct {
       Int32 ReturnCode;
       Int32 Length;
       char  Body[ROWSIZE];
    } inmdtyp,*inmdptr;

    inmdptr inmodptr;
    char line[600];
    int doit()
    {
        char *p;
        p = inmodptr->Body;
        ReadFile();  //reads a line of the file into **line** string variable


    memcpy(p, line, strlen(line));
    p += strlen(line);

    inmodptr->ReturnCode = 0;
    inmodptr->Length = p - inmodptr->Body;

    reccnt++;
}

しかし、Windows XP SP3 マシンで上記のプログラムを実行すると、次のようなエラー メッセージ ボックスが表示されます。

"<メモリ アドレス>" の命令が "<メモリ アドレス>" のメモリを参照しました。メモリに「書き込み」できませんでした。[OK] をクリックして終了します....

同様の問題が発生している同様のメモリ操作を実行しようとしたときに、同様の問題に直面しました。strcpy は私にとって最適に機能しますが、strcpy は行の NUL 文字まで読み取りを省略しますが、行の NUL の後でも読み取られる文字がいくつかあります。誰でもこれに対する回避策または解決策を提供してください。

環境: Windows XP SP3、GCC コンパイラ。

同様のコードのコンパイルと使用をsolaris unixで試してみましたが、同じ問題に直面しています。

OpenCV Python、C サンプルの一部でも同様のエラーに直面しています。

編集: 申し訳ありません.. p = inmodptr->Body;inmodptr で初期化されたポインタ p は構造体です。ポインターの初期化が問題ではないことを確認できます。明確にするために完全なコードを投稿

4

2 に答える 2

2

pバッファを割り当て、そのバッファのアドレスを保持する必要があります。その後、p同じように使用できます。

ポインタは、メモリアドレスを保持する変数です。あなたのポインタは、おそらく有効なメモリアドレスを指していない初期化されていない値を保持しています。

char *p = malloc(strlen(line) + 1);

文字列を保存している場合、余分な+1ものは NULL で終了する char\0です。memcpy何らかの理由で代わりに使用している場合はstrcpy、バッファを手動で NULL で終了する必要があります。

また、一度使用した場合はmalloc必ずfree使用してください。また、単純に文字の配列をスタック割り当てし、代わりにそれを使用することもできますp

于 2010-08-23T13:07:20.780 に答える
0

この行:

inmdptr inmodptr;

pointerinmodptrを宣言しますが、初期化はしません - ランダムなメモリ位置を指しています。

struct inmod_structオブジェクトの実際のインスタンスを保持できる場所を指すようにする必要があります。たとえば、次のようになります。

inmdtyp inmod;
inmdptr inmodptr = &inmod;
于 2010-08-23T13:08:39.633 に答える