指针) 有没有可能 (ptr + 1) 已经被占用?

Mat*_*oon 1 c c++ memory arrays pointers

char data;
char *ptr = &data;
*ptr = 3;
*(ptr+1) = 5;
Run Code Online (Sandbox Code Playgroud)

所以我正在研究指针,有一件事我很不明白。

当使用指针数组,你怎么知道地址ptr+1ptr+2等没有被其他变量占用?

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

或者更极端的例子是什么ptr + 1000

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

Eri*_*hil 5

定义char data;为 1 保留空间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]

通常,您应该使用指针算法来访问您知道为您保留的空间。(专用代码中可能会有例外或说明,例如操作系统内核中处理内存映射的代码或专用硬件中的代码。在普通用户程序中无需考虑此类可能性。)

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

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