整型数组指针在c++中的实现
Integer array pointer implementation in C++
int a[5]={1,2,3,5,6};
int *apnt= a;
while (*apnt)
{
printf("The no is %dn",*apnt);
apnt++;
}
不像字符串,我知道在数组的末尾没有null元素。然而,我的代码总是给出以下输出,无论我多少次刷新内存,或重新启动xcode。这里发生了什么?谁能给我点化一下吗?
输出为:
The no is 1
The no is 2
The no is 3
The no is 5
The no is 6
The no is 32767
The no is 144723190
The no is 1694538263
The no is 1606416704
The no is 32767
The no is -1982110263
The no is 32767
读取数组的末尾是未定义的行为。你所看到的,即使你看到了什么,也是c++语言规则无法预测的。
你得到这个输出是偶然的,它可能在每台机器上都不同,甚至每次运行。这里它做了一些其他的事情,但是它真的可以做任何事情
我认为其他的答案是错误的你的问题的意图-我假设你不是试图在c++中找到未定义的行为,只是寻找迭代你的数组。在你的代码中的问题,是你不断增加指针apnt
超过数组的结束。这是未定义的行为,任何事情都可能发生。
然而,通常在这种情况下发生的是,您将继续读取 a
数组(函数中的其他局部变量)之后的内存。这解释了为什么"乱码"输出是可预测的。相反,你应该只迭代数组中元素的数量(例如:使用for循环),或者您可以在数组末尾添加'0',这样while循环将终止。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- std::random_device是如何实现的