これはなぜ機能しますか?malloc()に関する奇妙な動作
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char * abc = malloc(1) + 4; //WRONG use of malloc.
char * xyz = "abc";
strcpy(abc, xyz); //Should fail.
printf("%s\n", abc); //Prints abc
}
私はmalloc()の引数に1を渡しているので、十分なメモリがないためにstrcpyが失敗することが予想されます。代わりに、これは完璧にコンパイルされ、実行されます(Windowsの場合はlinuxではGCC、WindowsではdevC++)。
これは予想された動作ですか、それとも幸いな一致ですか?
これは良い習慣ではないと思われますが、なぜ機能するのですか?
malloc()
の末尾に+4
がないと、セグメンテーション違反が発生します。これは主に私が興味があることです。
「仕事」という意味ではありません。 –
あなたは精緻化できますか? – ale10ander
未定義のビヘイビアーを呼び出すことは、常に悪い考えです。かつてコードが呼び出されたときにコードが特定の方法で動作する理由を調べることには役に立たない。なぜ1バイトを割り当てるのに十分なメモリがないのだろうと思っているのか分かりませんが、あなたは 'malloc'と友人についていくつか誤解を抱くかもしれません。 'void * 'の算術演算も定義されていません。 – Olaf