-1

次のプログラムで何が起こっているのか説明してください。

プログラムの最初と最後に返されたアドレスをチェックアウトし、strerror(errno)毎回同じアドレスを返すことを確認しました.次に、これを確認したら、最初のケースで、同じアドレスをに割り当ててから、文字列をにptrコピーしましたII の場合、 から返されたアドレスに直接コピーしようと"Hello"しました。奇妙な発見がありました。次のことを説明していただければ幸いです。strcpy()"Hello"strerror(errno)

にコピー"Hello"した場合ptr、後続のように成功し、 がprintf()出力ptrされます。しかし、代わりにをHello渡すと、古いエラー メッセージが出力されます。両方のアドレスが同じですか?両方のアドレスが同じであることを確認しました。コピー先は の戻り値にコピーするのと同じはずです。この不一致を二重に確認するために、に直接コピーしようとしましたが、今回もうまくいきませんそして、同じ古いエラー文字列を出力します.しかし、驚くべきことは、この時点でも、アドレスとstrerror(errno)ptrprintf()ptrstrerror(errno)"Hello"ptrstrerror(errno)"Hello"strerror(errno)ptrstrerror(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
4

2 に答える 2

6

//Case2:
strcpy(strerror(errno),"Hello"); //Doesn't copy Hello there
printf("\n%s",strerror(errno));

の 2 回目の呼び出しstrerrorは、printfコピーしたものを上書きします。

これは悪い形です。

于 2013-05-14T15:17:27.660 に答える