次のプログラムで何が起こっているのか説明してください。
プログラムの最初と最後に返されたアドレスをチェックアウトし、strerror(errno)
毎回同じアドレスを返すことを確認しました.次に、これを確認したら、最初のケースで、同じアドレスをに割り当ててから、文字列をにptr
コピーしましたII の場合、 から返されたアドレスに直接コピーしようと"Hello"
しました。奇妙な発見がありました。次のことを説明していただければ幸いです。strcpy()
"Hello"
strerror(errno)
にコピー"Hello"
した場合ptr
、後続のように成功し、 がprintf()
出力ptr
されます。しかし、代わりにをHello
渡すと、古いエラー メッセージが出力されます。両方のアドレスが同じですか?両方のアドレスが同じであることを確認しました。コピー先は の戻り値にコピーするのと同じはずです。この不一致を二重に確認するために、に直接コピーしようとしましたが、今回もうまくいきませんそして、同じ古いエラー文字列を出力します.しかし、驚くべきことは、この時点でも、アドレスとstrerror(errno)
ptr
printf()
ptr
strerror(errno)
"Hello"
ptr
strerror(errno)
"Hello"
strerror(errno)
ptr
strerror(errno)
本当にずっと同じです!! どのように可能ですか?それらが同じである場合、どのように異なる文字列を指しているのですか?1つ"Hello"
は古いカスタムエラーメッセージですか?
この背後にある理由を説明してください。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{ char *ptr;
FILE * fp;
fp = fopen ("missingfile.txt","r");
if (fp == NULL)
printf ("%s\n",strerror(errno));
printf("\n%p",strerror(errno)); //Initial address
//Case1:
ptr=strerror(errno);
strcpy(ptr,"Hello");
printf("\n%s",ptr); //Prints Hello
printf("\n%s",strerror(errno)); //Still prints old message
//Case2:
strcpy(strerror(errno),"Hello"); //Doesn't copy Hello there
printf("\n%s",strerror(errno)); //Still prints old message
printf("\n%p",strerror(errno)); //Address same as it was at start
printf("\n%p",ptr); //same address as above statement
return 0;
}
出力
No such file or directory
00032508
Hello
No such file or directory
No such file or directory
00032508
00032508