2017-01-30 8 views
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); 
} 
+0

未定義の動作は、クラッシュやセグメンテーション違反などを引き起こす必要はありません。プログラムは_any_の問題もなく期待通りに動作するかもしれません。しかし、毎回これに頼らないでください。一度、あなたのプログラムは正常に動作するかもしれませんが、次回はそうではありません! UBは絶対に避けてください! –

+1

「明らかに働いているフィン」は、「定義されていないヘビ表示」の一部です。 –

答えて

6

strcpyは、バッファが短すぎると認識していません。それはちょうど4バイトを書きました。

これは、その時点でクラッシュが(あなたがページ境界をヒットした場合、例えば電気柵とLinux上で(-lefenceリンクオプション)を有効にすることを実行してみてください)か、またはの他の部分に厄介な副作用を持っていますあなたのプログラム。

だからprintfは正しく動作しますが、許可されていない場所に書かれている可能性があります。

関連する問題