gpt4 book ai didi

c - 为什么 strcpy(strerror(errno) ,"Hello") 不复制 "Hello",但 {ptr=strerror(errno);strcpy(ptr ,"Hello");} 复制?

转载 作者:行者123 更新时间:2023-11-30 18:18:06 29 4
gpt4 key购买 nike

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

我在程序的开头和结尾检查了 strerror(errno) 返回的地址,并确认它每次都返回相同的地址。然后一旦确定这一点,在第一种情况下我继续将相同的地址分配给 ptr,然后使用 strcpy() 将字符串 "Hello" 复制到其中。在情况 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

最佳答案

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

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

这从头到尾都是不好的形式。

关于c - 为什么 strcpy(strerror(errno) ,"Hello") 不复制 "Hello",但 {ptr=strerror(errno);strcpy(ptr ,"Hello");} 复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16546825/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com