为什么strcpy(strerror(errno),"Hello")没有复制"Hello",但是{ptr = strerror(errno); strcpy(ptr,"Hello");}呢?

Rüp*_*ure -1 c pointers strcpy string.h strerror

请解释以下程序中发生的情况.

我检查了strerror(errno)程序开头和结尾返回的地址,并确认每次返回相同的地址.然后一旦确定,在第一种情况下,我继续分配相同的地址ptr,然后复制一个字符串"Hello"到它用strcpy().在案例二,我试图复制"Hello"直接通过返回的地址strerror(errno).我曾奇findings.I'll感激,如果你解释下:

在一个情况下,我复制"Hello"ptr它是成功的,因为在随后printf(),ptr打印Hello.但是,当我通过了strerror(errno),而不是ptrprintf(),它打印旧的错误message.How是有可能,ptr指向一个消息,但strerror(errno)指向另一个消息时两个地址是一样的吗?我验证了两个地址都是一样的,我希望复制"Hello"ptr应该与将它复制到返回时相同strerror(errno).为了加倍检查这个差异,然后我试着"Hello"直接复制到strerror(errno)但这次它也不起作用它打印出相同的旧错误字符串.但令人惊讶的是,在这一点上,我再次验证了地址ptr并且strerror(errno)确实一直都是相同的!怎么可能?如果它们是相同的,它们如何指向不同的字符串?"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;
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT

No such file or directory

00032508
Hello
No such file or directory
No such file or directory
00032508
00032508
Run Code Online (Sandbox Code Playgroud)

Ric*_*tze 6

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

你的第二个电话,以strerrorprintf复制什么覆盖.

这是糟糕的形式,一直到来.