gpt4 book ai didi

c - 为什么这段 C 代码不更改字符串并导致缓冲区溢出?

转载 作者:行者123 更新时间:2023-12-02 06:29:40 24 4
gpt4 key购买 nike

这段代码是我写的

#include <stdio.h>

int main()
{
char String[] = "Hello the world!";
char *pointer = String;
int i;

printf(" %s\n", pointer);

pointer = "Helllooooo the worlldddddd";
printf("Hello %s\n", pointer);
printf("Hello %s\n", String);

return 0;
}

但我不明白这条线是如何工作的。

pointer = "Helllooooo the worlldddddd";

但我得到了这个输出

 Hello the world!
Hello Helllooooo the worlldddddd
Hello Hello the world!

如您所见,它无法更改 String 值,但它显示的字符数超过了原始字符数。这不应该导致缓冲区溢出吗?这不会破坏其他变量吗?

最佳答案

当你写这行的时候

pointer="Helllooooo the worlldddddd";

您不是在说“获取 pointer 指向的数组并用字符串 "Helllooooo the worlldddddd" 覆盖其内容”,而是“更改 which string pointer points at so it now pointing at the string ""Helllooooo the worlddddddd"."这解释了为什么你会看到原始字符串当您直接打印 String 时打印出来 - 您实际上从未修改过它。因此,您不必担心此处的数组溢出,因为您实际上并没有向它写入任何内容。

另一方面,如果你写了

strcpy(pointer, "Helllooooo the worlldddddd");

实际上确实将新字符串的内容复制到指针指向的缓冲区中,然后您发生缓冲区溢出,这将是一个问题。但请注意,这是一个非常不同的操作,它明确表示“请将此字符串的内容复制到此位置”而不是“更改此指针指向的位置”。

关于c - 为什么这段 C 代码不更改字符串并导致缓冲区溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42398690/

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