我有一个功课问题,我正在努力。我和其他一些学生都很确定我们的老师是错误的,但也许不是。我已经在这里检查了一些问题,并且无法真正找到一种方法来使用指针来创建本质上是一个数组。说明如下。
代码是这个
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号工资标记一个分段错误
我的主要目的(因为我几乎是积极的,我的老师写错了)是要更多地了解指针,所以学习这些令人困惑的东西的任何和所有提示和技巧将不胜感激。谢谢你们!
答案 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;
}