-1

请解释以下程序中发生了什么。

我检查了strerror(errno)程序开始和结束时返回的地址,并确认它每次都返回相同的地址。然后一旦确定这一点,在第一种情况下,我开始分配相同的地址ptr,然后将字符串复制"Hello"到它使用strcpy().In case II,我尝试"Hello"直接复制到由.我返回的地址strerror(errno)。我有奇怪的发现。如果您解释以下内容,我将不胜感激:

万一,我复制"Hello"ptr并且它在随后printf()ptr打印中成功Hello。但是,当我传递strerror(errno)而不是传递ptr到时printf(),它会打印旧的错误消息。怎么可能ptr指向一条消息但strerror(errno)指向另一条消息时两个地址相同?我验证了两个地址相同,我希望复制"Hello"ptr应该与将其复制到返回相同strerror(errno)。为了双重检查这种差异,然后我尝试"Hello"直接复制到,strerror(errno)但这次也不起作用它会打印相同的旧错误字符串。但令人惊讶的是,在这一点上,我再次验证了地址ptrstrerror(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;
}

输出

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));

strerror您对in 的第二次调用会printf覆盖您复制的内容。

这是不好的形式,一路走来。

于 2013-05-14T15:17:27.660 回答
3

手册页

此字符串不得由应用程序修改,但可以通过后续调用strerror()来修改。

因此,虽然该函数不返回一个const指针,但它不应该修改,包括复制到它。

strerror实际上可能有一个缓冲区,这static就是您从它返回相同指针的原因。

于 2013-05-14T15:14:08.687 回答