请解释以下程序中发生了什么。
我检查了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)
但这次也不起作用它会打印相同的旧错误字符串。但令人惊讶的是,在这一点上,我再次验证了地址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;
}
输出
No such file or directory
00032508
Hello
No such file or directory
No such file or directory
00032508
00032508