用指向数组的指针替换衰减的数组导致分段错误
Posted
技术标签:
【中文标题】用指向数组的指针替换衰减的数组导致分段错误【英文标题】:Replacing decayed array with a pointer to array resulting in segmentation fault 【发布时间】:2022-01-10 19:27:14 【问题描述】:我试图使用指针遍历数组:
#include <iostream>
#include <iterator>
int main()
char name[] "Abhi" ;
for (char* ptr_c name ; ptr_c != (ptr_c + std::size(name)); ++ptr_c)
std::cout << *ptr_c;
std::cout << "\n";
这会导致:Error: Segmentation fault core dumped
但是,在for
循环的条件测试中:
for (char* ptr_c name ; ptr_c != (ptr_c + std::size(name)); ++ptr_c)
^^^^^^
将ptr_c
替换为name
使其工作。为什么?
name
不应该衰减到ptr_c
吗?
【问题讨论】:
ptr_c != (ptr_c + std::size(name))
将始终为真,如果 std::size(name)
不为零。因此,您的循环是无限的,并且由于每次迭代都访问*ptr_c
,然后递增ptr_c
,因此您的代码正在访问name
末尾之后的数据。而 name + std::size(name)
对于每个循环迭代都是相同的 - 最终 ptr_c
将等于它。
【参考方案1】:
ptr_c != ptr_c + std::size(name)
这个条件永远不会是假的。如果将非零数添加到指针,则生成的指针将永远不会等于原始指针。因此,无限循环会溢出数组。
不应该将衰变命名为 ptr_c 吗?
没有。 name
总是衰减为指向第一个元素的指针。 ptr_c
只作为第一个元素开始,但在第一次迭代后,它指向其他元素。
【讨论】:
哦,谢谢,我现在明白了!ptr_c
正在递增,因此在第一次迭代后,它不再充当指向 name
的第一个元素的指针以上是关于用指向数组的指针替换衰减的数组导致分段错误的主要内容,如果未能解决你的问题,请参考以下文章