0

こんにちは、私はプログラムを書いており、次の方法で文字列を宣言しています:

char *string=malloc(sizeof(char));

私のラップトップでは 64 ビットの Mint OS を使用しており、すべて正常に動作しています。ただし、32 ビットの Debian マシンでは、そのコード行でセグメンテーション エラーが発生します。malloc を使用せずに文字列を宣言すると、次のようになります: char string[100]プログラムは正常に動作しています。GDB でプログラムを実行すると、malloc.c が見つからないなどのメッセージが表示されます。この動作は論理的ですか?誰かが以前に同じ問題を経験したことがある場合は、その理由を説明してください。よろしくお願いします。

4

4 に答える 4

3

文字列に 1 バイトしか割り当てていないため、おそらく他の変数または malloc ヒープ構造を上書きしています。

変化する:

char *string=malloc(sizeof(char));

より現実的なサイズに、例えば:

char *string=malloc(256);
于 2012-11-27T14:19:49.687 に答える
2

他の答えに加えて、32ビットで失敗する理由を説明しようとしますが、64ビットで成功します:

ほとんどの場合、メモリ マネージャーは、システムのワード サイズに依存する特定の粒度で動作します。おそらく、32 ビット システムでは 4 バイト、64 ビット システムでは 8 バイトです。(ただし、これが正しいかどうかはわかりません。)

1バイトを割り当てると、3つのrespがあります。未使用の7バイト。したがって、それらを使用することは許可されていませんが、何も起こりません。

3 バイトを超えて 7 バイトまで使用すると、64 ビット システムでは何も起こりませんが、32 ビット システムではプログラムがクラッシュします。

于 2012-11-27T14:25:30.510 に答える
1

100 文字の文字列を割り当てるには、101 文字を割り当てる必要があります。+1 は終了文字'\0'なので、次のようになります。

char *string = malloc(sizeof(char) * 101);

sizeof(char)オペレーティング システム (65/32 ビット) と互換性のある char を作成できます。
char は 64 ビット システムでも 32 ビット システムでも常に同じサイズですが、32 ビットintまたはlong64 ビットではサイズが異なります。

于 2012-11-27T14:27:30.897 に答える
0

malloc の POSIX から:

The pointer returned if the allocation succeeds shall be suitably aligned so that it may be assigned to a pointer to any type of object and then used to access such an object in the space allocated (until the space is explicitly freed or reallocated). 

これは未定義の動作ですが、説明は「適切に配置された」というフレーズにあります。これは完全に実装で定義されていますが、ほとんどのアーキテクチャでは少なくともワード境界にある必要があります。

これが真であると仮定すると、単語のサイズによって、次に「適切に配置された」メモリ位置がどこにあるかが決まります。割り当てられた 1 バイト バッファの先頭から 4 バイトまたは 8 バイト離れています。

したがって、このコードは別として、説明には問題があるようですが、実装では、「いくつかのバイト」がワードサイズの関数である、どのmallocの終わりを超えて過去のいくつかのバイトに書き込むことができるということです..

于 2012-11-27T15:27:36.263 に答える