2013-05-14 49 views
-1

请解释以下程序中发生了什么。为什么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)而不是ptrprintf()时,它会打印旧的错误消息。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; 
} 

OUTPUT

No such file or directory 

00032508 
Hello 
No such file or directory 
No such file or directory 
00032508 
00032508 
+0

你不能这样做,你为什么要这样做?这没有意义。 – 2013-05-14 15:23:02

+0

@JonatanGoebel其实我读过'返回的指针指向一个静态分配的字符串,它不会被程序修改'。我只是修补它,很惊讶地看到同一个地址可以是两个不同的字符串,一个是'Hello'和另一个是自定义错误消息.'''''''''''''''''',还有其他的消息,但'ptr'和'strerror(errno)'都是同一个地址! – 2013-05-14 15:32:18

回答

6

printf

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

你的第二个电话给strerror覆盖你复制的东西。

这是一种坏形式,一直存在。

3

the manual page

此字符串不能由应用程序进行修改,但是也可以通过后续的呼叫被修改为strerror()这样

因此,虽然功能没有返回const指针,它仍然应该被修改,并且包括复制它。

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

+0

但是,我怎么设法复制到该字符串地址间接使用'ptr'?我设法复制为打印'ptr'显示,但令人惊讶的是,它不显示相同的结果时,我通过'strerror(errno)'为尽管我已经使用了'ptr = strerror(errno)''并且双重验证了两个地址是相同的,但它仍然是'printf()'的参数。 – 2013-05-14 15:15:58

+2

更具权威性的是,标准表示:“strerror函数返回一个指向字符串的指针,其内容是语言环境 - 指定的数组不应该被程序**修改,但可能被覆盖随后调用strerror函数“。 “不得”违反意味着未定义的行为。 – 2013-05-14 15:17:02

相关问题