gpt4 book ai didi

c - K&R代码示例混淆: copy string

转载 作者:太空宇宙 更新时间:2023-11-04 05:27:44 26 4
gpt4 key购买 nike

在第一章中,K&R介绍了一个函数copy,如下:

void copy(char to[], char from[]) {
/* copy from from[] to to[], assumes sufficient space */
int i = 0;
while ((to[i] = from[i]) != '\0') {
i++;
}
}

稍微修改一下这个函数,我得到了一些意想不到的结果。示例程序:

int main() {
char a[3] = {'h', 'a', '\n'};
char b[3];
printf("a: %s", a); // prints ha
copy(b, a);
printf("a: %s", a); // prints nothing
printf("b: %s", b); // prints ha

return 0;
}

现在回答我的问题:

  1. 为什么从 a 复制到 b 有效,这就是为什么复制中的 while 循环永远终止,即使 a 不包含“\0”?

  2. 为什么 a 发生了变异?

最佳答案

您可能遇到缓冲区溢出。

由于 a 未正确终止(缺少 \0),copya 复制到 b 只要它没有找到 \0。因此,有更多字节写入 b,因为它可以包含这些字节,然后溢出到 a(平台相关,未定义的行为)。

溢出的部分是 a 之后的 \0,从而使 a 成为零长度字符串。

您的堆栈可能如下所示:

                        b        a        
[ arbitrary memory ][ 0 0 0 ][ h a \n ][ 0 ? ? ? ? ]

? 表示未知数据,因为我们不知道那里有什么,也没有指定。但我们知道必须有一个0,否则printf会打印出更多垃圾。

copy 复制直到在开头 a 之后 找到一个零。偶然有一个0a 结束之后,然后被复制到 b。因为 b 已经充满了ab 的内容溢出到 a 中,使您的堆栈看起来像这样:

                        b         a
[ arbitrary memory ][ h a \n ][ 0 a \n ][ 0 ? ? ? ? ]

由于 a 开头有一个 \0printf 假定 a 为空。

关于c - K&R代码示例混淆: copy string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18338271/

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