我对指针有疑问。这是我的问题:
编写一个函数
int* read_data(int& size)
,从cin
读取数据,直到用户通过输入Q终止输入。该函数应将size参数设置为数字输入的数量。返回指向堆上数组的指针。该数组应具有完全大小的元素。当然,您不会在一开始就知道用户将输入多少元素。从10个元素的数组开始,每当数组填满时,大小加倍。最后,分配一个正确大小的数组并将所有输入复制到其中。一定要删除任何中间数组。
这是我的代码:
int* read_data(int& size);
int main()
{
int size ;
int* account_pointer = read_data(size);
int* account_array = new int[size];
int* bigger_array = new int[2 * size];
for (int i = 0; i < size; i++)
{
bigger_array[i] = account_array[i];
}
delete[] account_array;
account_array = bigger_array;
size = 2 * size;
system("PAUSE");
return 0;
}
int* read_data(int& size)
{
int input;
cout << "Enter integer, Q to quit : " ;
while(cin >> input)
{
size++;
}
return &size;
}
但是,当我插入非数字时,我收到一条错误消息。错误消息为Debug Error! Invalid allocation size : 4294967295 bytes
。我是否错误地在main方法中声明了size变量?或者我的整个代码都被错误编码了?
答案 0 :(得分:6)
在main()
中,您需要将size初始化为0.如果没有初始化,则其值是未定义的。
答案 1 :(得分:1)
所以...冒着为他们做某人学校项目的风险( ahem )这就是我要做的事情:
#include "stdafx.h"
#include <iostream>
int* read_data(int& size);
int _tmain(int argc, _TCHAR* argv[])
{
int size = 0;
int* result = read_data(size);
int* end = new int[size];
for(int i=0;i<size;i++)
end[i] = result[i];
for(int i=0;i<size;i++)
std::cout<<end[i];
delete []end;
delete []result;
return 0;
}
int* read_data(int& size)
{
int input;
int arraySize = 10;
int *arrInt = new int[arraySize];
std::cout << "Enter integer, Q to quit : " ;
while(std::cin >> input)
{
arrInt[size++] = input;
if(size >= arraySize) //time to resize
{
arraySize *= 2; //double size
int* arrInt2 = new int [arraySize];
for(int i=0;i<size;i++)
{
arrInt2[i] = arrInt[i];
}
delete [] arrInt;
arrInt = arrInt2;
}
}
return arrInt;
}
答案 2 :(得分:1)
从数组10开始
宣布规模但尚未初始化
每当阵列填满时加倍
这个^步骤应该在read_data(..)中,而不是在main()中,也应该是自动的。
用户通过输入Q
来终止输入
在此代码段中,您提供的方法无法测试可能的输入。
返回指向堆上数组的指针
整数地址绝不是堆上的数组,而且,虽然大小最初是未初始化的,但是在函数返回之后它返回该变量的ADDRESS,因此在执行期间会出现大量数字,因此程序尝试分配4数十亿......
上一期我可以看到a.t.m.是你丢弃任何用户输入,而不是将其输入任何阵列......
所以我的提示:
移动大小声明和所需的任何变量,包括数组INSIDE read_data(...);
实际解析输入;
使read_data(...)实际上返回它应该的内容。
修复这些,你应该全部设置^。^