滥用指针会产生分段错误。我仍然不确定如何纠正它

Posted

技术标签:

【中文标题】滥用指针会产生分段错误。我仍然不确定如何纠正它【英文标题】:Misuse of a pointer is producing a segmentation fault. I'm still not sure how to correct it though 【发布时间】:2020-05-30 00:48:28 【问题描述】:

阅读后,我觉得我明白这里出了什么问题,但我不知道如何解决它。据我了解,问题在于我如何在第 4 行(强调)中编写数组的输入。问题本身是,当我第一次在任何 IDE 中运行代码时,它工作正常,但是当我尝试处理数字时,它会将新数组视为与第一个数组共享大小,即使当它没有。看来我应该以某种替代方式重写第 4 行,以免滥用指针,但我不确定如何。

using namespace std;

void INSERTIONSORT(int* A)  //THIS IS LINE 4
    int i;
    int key;
    for (int j = 0; j < sizeof(A); j++) 
        key = A[j];
        i = j - 1;
        while (i >= 0 && A[i] > key) 
            A[i + 1] = A[i];
            i = i - 1;
        
        A[i + 1] = key;
    


void display(int* A) 
    for (int i = 0; i <= sizeof(A)-1; i++)
        cout << A[i] << " ";
    cout << endl;


int main() 
    int myArray[] =  2,1,4,3 ;
    cout << "Array before Sorting: ";
    display(myArray);
    INSERTIONSORT(myArray);
    cout << "Array after Sorting: ";
    display(myArray);
    return 0;
```

【问题讨论】:

在函数INSERTIONSORT中,sizeof(A)是指针的大小,而不是指针指向的目标的大小。要么传递数组的大小,要么切换到std::vector 或者std::array。这也适用于display() 函数。 你是最棒的!非常感谢! 表达式int * A表示变量A指向一个单个整数。无法做出其他假设。有一个传递数组的语法,如果你坚持使用数组,你应该查找它。 【参考方案1】:

这行是问题所在:

for (int j = 0; j < sizeof(A); j++) 

您需要的是数组的大小(元素的数量),您得到的是指针的大小(以字节为单位)(=4,对于 32 位系统),通常您希望显式传递数组大小或者使用某种知道自己大小的容器 (std::vector)。

【讨论】:

以上是关于滥用指针会产生分段错误。我仍然不确定如何纠正它的主要内容,如果未能解决你的问题,请参考以下文章

默认构造函数的分段错误

在调用函数中取消引用指针时出现分段错误

尝试从方法返回指向对象的指针时出现分段错误

分段错误,不确定来源

如何在 C++ 中跟踪无效指针?

如何使用边界矩形纠正 OCR 分割错误?