家庭作业:使用指针制作数组

时间:2015-12-04 20:48:08

标签: c++ arrays pointers segmentation-fault

我有一个功课问题,我正在努力。我和其他一些学生都很确定我们的老师是错误的,但也许不是。我已经在这里检查了一些问题,并且无法真正找到一种方法来使用指针来创建本质上是一个数组。说明如下。

  1. 重写以下程序以使用指针而不是数组:
  2. 代码是这个

    int main()
    {
        int salary[20];
        int i;
        for (i = 0; i < 20; i++)
        {
            cout << "Enter Salary: ";
            cin >> salary[i];
        }
        for (i = 0; i < 20; ++i)
            salary[i] = salary[i] + salary[i] / (i + 1);
    
        return 0;
    }
    

    我的解决方案是:

    int main()
    {
        int* salary_pointer = new int;
        for (int i = 0; i < 20; i++)
        {
            cout << "Enter Salary: ";
            cin >> *(salary_pointer + i);
        }
        for (int i = 0; i < 20; ++i)
        {
            *(salary_pointer + i) = *(salary_pointer + i) + *(salary_pointer + i) / (i + 1);
            cout << *(salary_pointer + i) << endl;
        }
        delete salary_pointer;
        return 0;
    }
    

    它会在大约13号工资标记一个分段错误

    我的主要目的(因为我几乎是积极的,我的老师写错了)是要更多地了解指针,所以学习这些令人困惑的东西的任何和所有提示和技巧将不胜感激。谢谢你们!

4 个答案:

答案 0 :(得分:9)

使用

int* salary_pointer = new int[20];

相反,当你分配20 int时,不只是一个。然后,使用

删除动态数组
delete[] salary_pointer;

而不是delete salary_pointer。在这里也要小心:

salary[i] / (i + 1);

如果操作数为int,则最终会截断。如果您希望结果为salary[i]/(i + 1.),请使用double(在这种情况下,您最好使salary成为double的数组或指向double的指针你不再有这个问题了。)

答案 1 :(得分:1)

你的老师没有错过。你的程序中有bug。

您分配了多少个元素? 您尝试迭代和解除引用的元素数量是多少? 你释放了多少元素?

您正在获取seg错误,因为您正在取消引用未分配的内存。

我更具体,但在家庭作业方面,给予太多的帮助并不能帮助你变得更好。

这种手动内存管理将在以后大部分时间使用STL容器时完成,但指针和数组之间的关系以及指针运算的能力非常重要。

答案 2 :(得分:0)

为什么你的老师错了?

以下是发生的事情。您正在创建指向SINGLE整数的指针。当您遍历for循环时,您正在做的事实上是覆盖可能的内存,并且我可能会被程序的其他位使用。这会导致未定义的行为,包括崩溃。

重做内存分配,您的访问冲突应该消失。另外,使用变量来保存你的&#39; 20&#39;。像const int MAX_SALARIES = 20这样的东西。学会这样做,因为它将来会为你节省很多麻烦。

答案 3 :(得分:-1)

在本声明中

int* salary_pointer = new int;

只分配了一个int类型的对象。

由于使用了除法运算,最好为数组使用float类型而不是int

我建议以下解决方案。它只使用指针。

#include <iostream>

int main()
{
    const size_t N = 20;
    float *salary = new float[N];
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
    for ( float *p = salary; p != salary + N; ++p )
    {
        std::cout << "Enter Salary: ";
        std::cin >> *p;
    }

    for ( float *p = salary; p != salary + N; ++p )
    {
        *p += *p / ( p - salary + 1 );
    }

    delete [] salary;
    ^^^^^^^^^^^^^^^^
    return 0;
}