【问题标题】: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 将等于它。

标签: c++ arrays for-loop pointers segmentation-fault


【解决方案1】:
ptr_c != ptr_c + std::size(name)

这个条件永远不会是假的。如果将非零数添加到指针,则生成的指针将永远不会等于原始指针。因此,无限循环会溢出数组。

不应该将衰变命名为 ptr_c 吗?

没有。 name 总是衰减为指向第一个元素的指针。 ptr_c 只作为第一个元素开始,但在第一次迭代后,它指向其他元素。

【讨论】:

  • 哦,谢谢,我现在明白了! ptr_c 正在递增,因此在第一次迭代后,它不再充当指向 name 的第一个元素的指针
猜你喜欢
  • 2011-11-14
  • 2020-10-02
  • 1970-01-01
  • 2021-05-06
  • 2021-05-08
  • 2018-07-29
  • 2015-06-20
  • 1970-01-01
  • 2018-02-20
相关资源
最近更新 更多