指针数组问题
Pointer array question
int test[3] = {1,2,3};
cout<<test[3]<<endl;
// this will get a error
,
int test[3] = {1,2,3};
int (*A)[3];
A = &test;
cout<<test[3]<<(*A)[3]<<endl;
// this will print -858993460 withiout any errors
谁能告诉我为什么?我真的很困惑。
在第一种情况下,为什么它不是越界错误,而是一个未定义的错误?为什么第二种情况不会出现错误?我曾经认为它们是一样的……
实际上我知道数组从0开始,我很困惑为什么第一个得到了一个错误,但第二个不会????
您正在调用未定义的行为。在这两种情况下,你的索引都超出了数组的边界;相应的行为未定义。它可能会崩溃,或者它可能会输出无意义的内容,或者它可能会做其他事情。
未定义行为对于新手来说似乎是一个非常棘手的概念。但这很简单,如果你违反了c++的规则(就像你的例子中和所做的那样),那么,你的程序的行为通常是不确定的。它的意思就是它所说的,问"为什么它这样做"是毫无意义的,因为不再有任何规则或法律适用于你的情况。
C/c++中的数组下标从0开始。因此,大小为3的数组具有有效的索引0、1和2。
现在,在程序堆栈上有变量test
。因此,数组边界之外的内存仍然是你的(这就是为什么当你读取数组的索引3时,你不会得到分段错误(访问冲突)错误)。然而,您正在读取堆栈的一部分,这是您之前的函数调用中的乱码,驻留在内存上的乱码或函数中的其他变量。这就是为什么你会得到奇怪的数字。
你应该注意不要超出数组边界。在一个复杂的程序中,这真的很难调试,因为你遍历堆栈更改其他变量,而在调试时你所看到的只是变量的随机行为,你甚至没有碰过!!
相关文章:
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 输入std::数组时出现问题
- 类对象数组的问题会导致崩溃
- 传递二维数组时出现问题
- 从 C++ 中的函数返回数组地址问题
- 使用数组时出现问题
- 打印问题.我在数组中打印值时遇到一些问题
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 将字节数组转换为带有字节序问题的指针
- C++ 填充数组时遇到问题
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 当我尝试通过 arduino 上的引用传递布尔数组时出现问题
- 我正在尝试解决一个需要数组总和值但代码不起作用的问题,我想做这样的事情
- 编写 cin.get() 以接收字符数组时出现问题
- 在 C++ Consol 中的数组中执行用户命令时出现问题
- 存储另一个函数返回的布尔数组时遇到问题
- 当我在 CLion 中读取数组中的 txt 文件时C++编码问题
- 运行时C++数组初始化问题
- 我在解决此错误时遇到问题.我正在努力在主函数中传递数组