2

C で動的に割り当てられた文字列がどのように機能するかわかりません。以下に、文字列へのポインタを作成して 0 メモリを割り当てたと思われる例を示しますが、それでも文字を与えることができます。私は明らかに何か間違ったことをしていますが、何ですか?

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

int main(int argc, char *argv[])
{
char *str = malloc(0);
int i;
str[i++] = 'a';
str[i++] = 'b';
str[i++] = '\0';
    printf("%s\n", str);

    return 0;
}
4

5 に答える 5

3

あなたがしていることは未定義の動作です。現在は動作しているように見えますが、動作する必要はなく、何か変更すると壊れる可能性があります。

malloc通常、使用できる指定されたサイズのメモリ ブロックを返します。あなたの場合、あなたが触れているそのブロックの外に有効なメモリがあるのはたまたまです。その記憶に触れることは想定されていません。mallocそのメモリを内部のハウスキーピングに使用したり、呼び出しの結果としてそのメモリを提供しmallocたり、まったく別の何かを提供したりする可能性があります。それが何であれ、それはあなたのものではなく、それに触れると未定義の動作が発生します.

于 2013-08-14T05:22:37.833 に答える
0

割り当てられていないメモリを上書きしています。これは機能しているように見えるかもしれません。しかしfree、ヒープ関数がメモリ ブロックを返そうとする場所を呼び出すと、問題が発生します。

返されたメモリの各malloc()チャンクには、ヘッダーとトレーラーがあります。これらの構造体は、少なくとも割り当てられたメモリのサイズを保持します。追加の警備員がいる場合もあります。このヒープの内部構造を上書きしています。free()それが文句を言ったりクラッシュしたりする理由です。

したがって、未定義の動作があります。

于 2013-08-14T05:32:11.440 に答える
0

そうすることで、に渡すことができるポインターまたは一意malloc(0)のポインターを作成しています。その行に問題はありません。問題は、ポインタ演算を実行し、割り当てていないメモリに値を代入する場合にあります。したがって:NULLfree

str[i++] = 'a'; // Invalid (undefined).
str[i++] = 'b'; // Invalid (undefined).
str[i++] = '\0'; // Invalid (undefined).

printf("%s\n", str); // Valid, (undefined).

次の 2 つのことを行うことは常に良いことです。

  1. malloc0 バイトにしないでください。
  2. malloc編集したメモリーのブロックが有効であることを確認してください。

... 要求されたメモリ ブロックが有効かどうかを確認するにmallocは、次の手順を実行します。

if ( str == NULL ) exit( EXIT_FAILURE );

... への電話の後malloc

于 2013-08-14T05:26:46.283 に答える
0

現在の C 標準のセクション 7.20.3 には、次のように記載されています。

「要求されたスペースのサイズがゼロの場合、動作は実装によって定義されます。null ポインターが返されるか、サイズがゼロ以外の値であるかのように動作しますが、返されたポインターはオブジェクトへのアクセスに使用されません。 ."

これは実装定義になります。NULLポインターを送信するか、前述のように参照できないものを送信できます

于 2013-08-14T05:24:57.087 に答える