如何解决C++ 动态数组创建
我被提示如下问题
- 编写一个打印动态数组的程序。
- 该程序创建了一个包含 3 个元素的 int 1D 动态数组,并且 一个包含 3 个 ROWS 和 3 个 COLS 的浮点二维动态数组。
- 用随机值初始化两个数组。
- 两个数组将在两个单独的函数中分别打印
- void print_2d_array(float**);
- void print_1d_array(int*);"
我创建了一个不会产生任何输出的代码。我猜问题在于数组的初始化,但我无法弄清楚。如何让它显示随机生成的数字?
#include <iostream>
#include <iomanip>
using namespace std;
void print_2d_array(float**);
void print_1d_array(int*);
int main() {
srand(time(NULL));
int* arr[3];
float** arr_two[3][3];
for (int i = 0; i < 3; i++)
*arr[i] = rand() % 100;
for (int j = 0; j < 3; j++)
for (int k = 0; k < 3; k++)
**arr_two[j][k] = rand() % 100;
print_1d_array(*arr);
print_2d_array(**arr_two);
}
void print_2d_array(float** arr_two) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cout << arr_two[i][j];
}
cout << endl;
}
void print_1d_array(int* arr) {
for (int i = 0; i < 3; i++)
cout << arr[i];
}
解决方法
您永远不会为一维 int
数组分配内存,也不会为 float
二维数组分配内存。您的声明也是错误的,例如 float** arr_two[3][3]
是一个大小为 3 的数组的大小为 3 的指向 float
的指针的数组,显然不是您想要的。
您的代码应该更像这样:
int *arr = new int[3]; // pointer to int will hold 3 ints
float **arr_two = new float *[3]; // array of 3 pointers to float
for (int i = 0; i < 3; i++)
{
arr_two[i] = new float[3]; // each pointer will hold 3 floats
}
for (int i = 0; i < 3; i++)
arr[i] = rand() % 100; // indexing is the same as if it was an array[size]
for (int j = 0; j < 3; j++) // indexing is the same as if it was an array[size][size]
for (int k = 0; k < 3; k++)
arr_two[j][k] = rand() % 100;
print_1d_array(arr); // you pass the name of the pointers,no dereference needed
print_2d_array(arr_two);
您还应该在打印函数中打印一些空格和换行符,否则这将看起来像一个非常大的单个值。
另外,不要忘记在以后不再需要数据时释放内存:
delete[] arr;
for (int i = 0; i < 3; i++)
{
delete[] arr_two[i];
}
delete[] arr_two;
我还应该提到,在现代 C++ 中,我们很少看到原始指针的使用(除了可能在 SO 问题中)。替代方案是:
- 智能指针,当您完成对指针和数组的理解后,请看一看,这是一个很好的起点:What is a smart pointer and when should I use one?。
- 或者最好使用 STL containers,在这种情况下,
std::vector
将是正确的工具。
另请注意,您的随机值都是 int
,因此您不会在 float
数组中看到 float
值。如果你想随机生成分数值,你需要一个新的方法,看看这里:Random float number generation
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。