Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指针太大时会发生什么情况? 在C++或C中,如果指针设置为一个值那么高,它超出了内存的界限,会发生什么?这里有一些代码可以做这样的事情: int* ptr = 0; while (true) { ptr += 1; // eventually this will go out of bounds of the memory ... unless there is an overflow. *ptr = 10; // just give it a value, why not? }_C++_C_Pointers - Fatal编程技术网

指针太大时会发生什么情况? 在C++或C中,如果指针设置为一个值那么高,它超出了内存的界限,会发生什么?这里有一些代码可以做这样的事情: int* ptr = 0; while (true) { ptr += 1; // eventually this will go out of bounds of the memory ... unless there is an overflow. *ptr = 10; // just give it a value, why not? }

指针太大时会发生什么情况? 在C++或C中,如果指针设置为一个值那么高,它超出了内存的界限,会发生什么?这里有一些代码可以做这样的事情: int* ptr = 0; while (true) { ptr += 1; // eventually this will go out of bounds of the memory ... unless there is an overflow. *ptr = 10; // just give it a value, why not? },c++,c,pointers,C++,C,Pointers,会发生什么?指针——当它超出16字节内存的界限时——是否从0xF翻转到0x0?它是否持续计数并且*ptr=10线路使计算机崩溃 我没有愚蠢到去尝试,但我很好奇。未定义的行为 事实上,增加一个指针,使其指向一个位置超过其最初指向的对象末尾的一个元素,会导致未定义的行为。(允许您构造一个刚过对象末尾的指针,但不能超过该端点。)(所讨论的对象是一个数组,非数组对象被视为具有一个元素的数组。) 这意味着语言标准没有说明会发生什么。它可能会“工作”,可能会使您的程序崩溃,可能会导致您的程序能够产生的任何症

会发生什么?指针——当它超出16字节内存的界限时——是否从0xF翻转到0x0?它是否持续计数并且
*ptr=10线路使计算机崩溃


我没有愚蠢到去尝试,但我很好奇。

未定义的行为

事实上,增加一个指针,使其指向一个位置超过其最初指向的对象末尾的一个元素,会导致未定义的行为。(允许您构造一个刚过对象末尾的指针,但不能超过该端点。)(所讨论的对象是一个数组,非数组对象被视为具有一个元素的数组。)

这意味着语言标准没有说明会发生什么。它可能会“工作”,可能会使您的程序崩溃,可能会导致您的程序能够产生的任何症状

在实践中,行为可能因系统而异。增加指针很可能与增加无符号整数的作用相同:在不引起任何可见问题的情况下更新值。如果尝试取消引用指针,结果取决于系统管理内存的方式


底线:未定义的行为是未定义的。

指针仅对对象或“1次传递”有效

指针可以被分配一个空指针值

p = NULL;
指针可以引用函数

就这样。将指针指定给其他值是未定义行为(UB),例如:

int* ptr = 0;
ptr += 1;  // UB  (NULL is not a pointer to a valid object, so "1 pass" is UB)

<>访问内存分配给你的内存(通过<代码>新< /COD>或 MALOC 等)是C++中的未定义行为,所以不要期望任何事情顺利进行。p> 在实践中,增加物理限制之外的指针是由平台定义的,对于大多数平台,它最终会滚动;访问它可能会导致崩溃


对于大多数现代操作系统,试图在进程分配之外读取或写入内存会导致访问冲突或分段错误

C/C++语言不是为现有的系统/机器定义的,而是一个抽象的黑盒(尽管它不会忽略现实)。您要求的是未定义的行为(某些现有系统/计算机可能会执行您期望的操作)

在我所了解的常见系统(主要是/仅是我的系统)上,指针的行为非常类似于
无符号long
s:

int main(){
    char* p = NULL;
    printf("%p\n", p);
    printf("%p\n", --p);
}
产出:

(nil)
0xffffffffffffffff

但是理论上,我想各种各样的异国情调都可能发生。

我认为,你的指针不会有任何问题,只要保存指针就不会发生任何事情,但是当你尝试取消引用/访问它时,我确信你的代码最终会导致访问冲突并导致程序崩溃。
或者,如果它是一个有效的指针,它会修改其他数据,可能会修改另一个变量内容。

我还没有蠢到去尝试,但我很好奇。
-试试看。这并不能取代正确的答案,但如果您运行在任何主要操作系统上,您不会在应用程序之外造成任何伤害。是的,指针不仅仅是值容器,它只会翻转。你在while body中的第二行有100%的UB几率。未定义的行为ahoy“我没有愚蠢到尝试,但我很好奇。”这就是VMs的用途!试想一下,有没有可能模拟一台计算机,你可以在其中做任何事情。疯狂地试验虚拟内存从来不会杀死任何人(进程除外。当你在不合适的内存点上乱涂乱画时,进程确实会被杀死),你绝对可以让指针指向一个对象。@EOF,但更具体地说,只是“刚刚”经过一个对象。@EOF:完全正确。我的措辞笨拙到了不正确的地步。我已经修好了。
(nil)
0xffffffffffffffff