gpt4 book ai didi

c - 为什么给定的 'C' 代码片段中 x 的值为 28?

转载 作者:行者123 更新时间:2023-11-30 19:27:10 25 4
gpt4 key购买 nike

char str1[] = "dills";
char str2[20] ="Hello";
char str3[] = "daffo";
int x;
x = strcmp("daffodills",strcat(str3, strcpy(str1, str2)));

我认为 -- strcpy(str1, str2)) 使 str1=“Hello”。 因此,strcat(str3, strcpy(str1, str2))= strcat(str3,”Hello”)= daffoHello。最后,strcmp(“daffodills”, “daffoHello”)=1,因为第一个不匹配字符 (d) 的 ASCII 值大于第二个 (H)。

但是,输出中 x 的编译器值为 28。

最佳答案

这是未定义的行为。 char str3[] = "daf​​fo"; 使数组足够大以容纳 "dills" 和后面的 null 终止符。然后你这样做:

strcat(str3, strcpy(str1, str2)));

这会向其附加另一个字符串,从而导致它溢出。我们可以推测为什么 x28,但是没有意义,因为它的值无法保证。它可能是其他任何东西,或者程序可能在输出结果之前崩溃(对我来说,存在堆栈损坏,使程序崩溃。这意味着对于程序控制流工作很重要的内存位置,例如堆栈指针,被 strcat 导致的未定义行为破坏)。

<小时/>

此外,strcmp给出定义为 0 的返回值,正数或负数。这是唯一的保证,我见过它可以返回诸如 28 之类的实现,以及它总是返回 01-1。因此,即使程序定义良好,如果没有有关所使用的 strcmp 实现的更多信息,也无法回答“为什么它返回 28”的问题。

关于c - 为什么给定的 'C' 代码片段中 x 的值为 28?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56004438/

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