gpt4 book ai didi

c++ - 指针)是否有可能已经占据(ptr + 1)?

转载 作者:行者123 更新时间:2023-12-01 15:06:37 32 4
gpt4 key购买 nike

char data;
char *ptr = &data;
*ptr = 3;
*(ptr+1) = 5;

因此,我正在研究指针,这是我完全不了解的一件事。

当您将指针用作数组时,如何知道地址 ptr+1ptr+2等未被其他变量占用?

因此,例如,地址 ptr + 1已被使用,如果我尝试在其中放入5,程序是否有可能崩溃?

或更极端的示例,例如 ptr + 1000

还是编译器确保它永远不会发生?

最佳答案

定义char data;保留一个char的空间。
char *ptr = &data;ptr设置为指向该char
ptr+1处的空间是而不是保留供您使用,并且C和C++标准都没有定义如果尝试使用它会发生什么。

定义char data[3];将为三个char保留空间。然后char *ptr = data;将设置ptr指向这些char中的第一个。也就是说,ptr的地址为&data[0],而*ptr的地址为data[0]

然后ptr+1将指向下一个char;它的地址将为&data[1],而*(ptr+1)将为data[1]

通常,您应该仅使用指针算术 来访问您知道保留供您使用的空间。 (对于特殊用途的代码,可能会有异常(exception)或澄清,例如用于处理内存映射的操作系统内核中的代码或特殊用途的硬件中的代码。您无需在普通用户程序中考虑这种可能性。)

编译器通常不会阻止您访问无效地址。在某些情况下,它可能会检测到超出范围的引用。通常,这仅在具有简单表达式的当前编译器中发生,其中完整定义对编译器可见,并且引用实质上使用常量索引。

操作系统可能会阻止您访问某些无效地址。但是,这只会阻止您访问无效地址,因为它们根本没有映射到您的程序,或者因为它们被映射为只读,但您尝试写入它们(或某些其他组合,例如尝试读取execute-仅内存)。操作系统不会阻止您不正确地访问程序所映射和可访问的地址。例如,计算不正确的指针值并在分配中使用它来更改内存可能会导致更改程序其他功能所需的数据。

关于c++ - 指针)是否有可能已经占据(ptr + 1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60901688/

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