0

複数の '\000' 終了文字を間に含む文字列に遭遇したアプリケーションを開発しています。文字列にヌル文字が必要です。これを処理している間、文字列は '\000' でのみ終了するため、ASCII 値を大きくしようとしています。しかし、私がそれを行うと、セグメンテーション違反が発生しました。

私は以下のようにコードセグメントを書いています

 char *content; 
 content = malloc(8);
 content = "\037\000\000\000\000\037\037\037";
 int content_length = 8;
 content[1] = content[1] + 1;    // Increasing the ASCII value

ここで、ASCII 値を増やす最後の行を削除すると、アプリケーションで受信されるのは 1 バイトだけです。したがって、2 番目のバイト (コンテンツ [1]) を変更すると、2 バイトを転送する必要がありますが、セグメンテーション エラーが発生します。

私は何か間違ったことをしていますか?16進数または8進数はそのようなことをしますか?

ありがとう

4

3 に答える 3

3
"\037\000\000\000\000\037\037\037"

文字列リテラルです。文字列リテラルは C では変更できません。文字列リテラルへの書き込みは未定義の動作です。

それで:

content = malloc(8);
content = "\037\000\000\000\000\037\037\037";

からいくらかのメモリを取得しmallocますが、ポインター オブジェクトを上書きして、他の場所 (文字列リテラル) を指すようにします。これは、メモリ リークと呼ばれます。

于 2013-03-23T17:47:20.843 に答える
1

ストレージを作成する必要があります。それを使用して配列を初期化します。

char content[] = "\037\000\000\000\000\037\037\037";

またはmalloc、配列ではなく使用する場合は、を使用memcpyして正確なバイト数をコピーできます。

memcpy(content, "\037\000\000\000\000\037\037\037", 8);
于 2013-03-23T17:59:28.813 に答える
1

私は何か間違ったことをしていますか?

絶対。contentまず、ポインターを別のものに再割り当てし、割り当てられたメモリを効果的にリークします。

次に、引用符で囲まれた文字列は、内容を変更できない文字列リテラルです。プログラムが未定義の動作を呼び出します。

于 2013-03-23T17:47:57.567 に答える