用指向数组的指针替换衰减的数组导致分段错误

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 的第一个元素的指针

以上是关于用指向数组的指针替换衰减的数组导致分段错误的主要内容,如果未能解决你的问题,请参考以下文章

结构中指向数组的 cudaFree 指针上的 CUDA 分段错误

将指向数组的指针传递给函数时出现分段错误(C++)

C - 指向结构指针的指针 - 分段错误

指针数组的分段错误

指针数组 C++ 的分段错误

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误