gpt4 book ai didi

c - C 中的字符串复制错误

转载 作者:行者123 更新时间:2023-11-30 21:15:49 26 4
gpt4 key购买 nike

我不明白为什么str1在这里发生变化。请帮忙。

#include<stdio.h>
#include<string.h>
int main (){
char str1[]="stackoverflowwwwwww";//str1
char str2[] = "stackoverflow";
char str3[40];
char str4[40];
char str5[] = "asdfgh";
strcpy(str2, str1);
strcpy(str3, "successful");
strcpy(str4, str5);
printf("str1: %s\nstr2: %s\nstr3:%s\nstr4:%s\n", str1, str2, str3, str4);
return 0;
}

输出为:

str1: www
str2: stackoverflowwwwwww
str3: successful
str4: asdfgh

为什么str1在这里发生变化?

最佳答案

您的程序包含缓冲区溢出。 str2 是一个缓冲区,其大小为 14 字节(“stackoverflow”的长度 + 终止 NULL 字符)。当您执行 strcpy(str2, str1) 时,您会溢出该缓冲区,因为 str1 长度超过 14 字节。 strcpy 无法知道缓冲区的大小,因此(根据其定义)它会盲目地从一个缓冲区复制到另一个缓冲区。

堆栈上的缓冲区溢出

现在,为什么这会改变 str1?嗯,因为当 strcpy 复制的字符多于目标缓冲区的大小时,这些字符必须到达某个地方。由于 str2str1 都在堆栈上分配,因此它们彼此相邻放置。因此,当 strcpy 复制到 str2 并溢出其大小时,它将移至内存中紧邻它的任何位置 - 在您的情况下,即 str1 >.

因此,strcpy 正在复制的最后一个字符 - str1 中的最后几个字符 - 被复制回 str1 的开头。

关于c - C 中的字符串复制错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51915133/

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