请解释以下程序中发生了什么。为什么strcpy(strerror(errno),“Hello”)没有复制“Hello”,而是{ptr = strerror(errno); strcpy(ptr,“Hello”);}呢?
我检查了开头和程序结束由strerror(errno)
返回的地址,并确认其返回相同的地址中的每个time.Then一旦确定了这一点,在第一种情况下我开始分配相同的地址ptr
然后用一个字符串"Hello"
复制使用strcpy()
。在情况II它,我试图直接复制"Hello"
由strerror(errno)
。我返回的地址已经奇数findings.I'll感激,如果你解释下:
如果一个,我复制"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;
}
OUTPUT
No such file or directory
00032508
Hello
No such file or directory
No such file or directory
00032508
00032508
你不能这样做,你为什么要这样做?这没有意义。 – 2013-05-14 15:23:02
@JonatanGoebel其实我读过'返回的指针指向一个静态分配的字符串,它不会被程序修改'。我只是修补它,很惊讶地看到同一个地址可以是两个不同的字符串,一个是'Hello'和另一个是自定义错误消息.'''''''''''''''''',还有其他的消息,但'ptr'和'strerror(errno)'都是同一个地址! – 2013-05-14 15:32:18