0
ここに私のコードです。 malloc()によって3バイトの予約メモリを持つ場所に4バイトをコピーします。ここで私の知る限りでは、メモリは十分ではないため、文字列はnullで終了しません。つまり、ABCはヒープ領域で3バイトになります。ここではnullが最後にないので、printfはq.ptrを出力してはならず、"ABC"
という印字になります。どうしてこんなことができるの?nullで終了しない文字列で未定義の動作を表示しないPrintf()
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct p
{
char *ptr;
};
void main()
{
struct p p,q;
p.ptr="ABC";
q.ptr=(char *)malloc(3*sizeof(char));
strcpy(q.ptr,p.ptr);
printf("%s\n",q.ptr);
}
未定義の動作は、クラッシュやセグメンテーション違反などを引き起こす必要はありません。プログラムは_any_の問題もなく期待通りに動作するかもしれません。しかし、毎回これに頼らないでください。一度、あなたのプログラムは正常に動作するかもしれませんが、次回はそうではありません! UBは絶対に避けてください! –
「明らかに働いているフィン」は、「定義されていないヘビ表示」の一部です。 –