1

以下はコードのスニペットです。

int main(void) {

    char sizing[] = "manshcanshcnams cndhan sndhcna snshans";
    char *xyz = malloc(sizeof(char));
    printf("%ld\n",sizeof(xyz));
    xyz = sizing;    // IT SHOULD FAIL HERE
    printf("Fail %s\n",xyz );
    return 0;

}

ご覧のとおり、xyz に保持できるメモリよりも多くのメモリを割り当てようとしています。しかし、出力は失敗しません。それは未定義の動作ですか?

4

3 に答える 3

3

で文字列をコピーすることはできません=。mallocしたメモリを指すのではなく、 array を指すようにxyz = sizing変数を変更するだけです。xyzsizing

したがって、メモリがリークされますが、未定義の動作はありません ( と を含めるのを忘れたことを除いて<stdio.h>) <stdlib.h>

于 2013-03-08T00:20:09.600 に答える
1

あなたがしているのは、ポインターxyzに、 sizingに関連付けられたメモリーアドレスを指すように指示することだけです。これが失敗する理由はありません。

于 2013-03-08T00:21:54.030 に答える
-1

私の理解では、malloc()要求された量のメモリを割り当てることができない場合を除いて、失敗することはありません。ただし、使用する場合は、不要になったときにそのメモリを解放する必要があります。そうしないと、プログラムがますます多くのメモリを要求し、何も解放していないために要求が失敗します。

また、すべての不正なメモリ操作がエラーを引き起こすわけではありません。たとえば、(以前のバージョンではコンパイルされないというKludasの観察に基づいて2013-03-08で編集されたコード):

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

int main(void)
{
    char myString[4];
    strcpy(myString, "abcdefghijklmnopqrstuvwxyz");  /* This overflows the buffer */
                                                     /* but MIGHT NOT cause an    */
                                                     /* immediate crash!          */
    printf("myString = [%s]\n", myString);
    return 0;
}

これはエラーをトリガーする場合としない場合がありますが、4つの項目(3文字と終了NULL)のみを保持する必要がある配列に26文字を書き込んでいるため、確かに違法です。

于 2013-03-08T00:45:26.060 に答える