使用 CPP 在之后添加新行的动态分配
dynamic allocation using cpp to add new row after
我想将一行添加到以前动态分配的二维数组中,但编译器给出了一个错误,即在我尝试将新内存分配给新行的行中需要左值。
#include<iostream>
//#include<stdlib.h>
using namespace std;
int main()
{
int (*p)[2] = new (int [5][2]);
for(int i =0; i<5; i++)
{
for(int j =0; j<2; j++)
{
p[i][j]= i;
}
}
// p = (int **) realloc(void*, 12)
int **l = (int **)p;
(l+5) = new int[1][2];
p[5][0] = 5;
p[5][1] = 5;
for(int i =0; i<=5; i++)
{
for(int j =0; j<2; j++)
{
cout<<p[i][j];
}
}
}
在C++代码中使用 C 样式数组将产生可怕的代码。它很难阅读,很难理解,最糟糕的是:难以维护。这里正确的解决方案似乎是改用std::vector
。
但是,如果您有理由不使用std::vector
(即它是某种学校作业(,您可以做的是用新构建的数组替换原始数组。所以你有一个类型 int (*)[2]
的指针:
// create an array and initialize it:
int (*p)[2] = new (int [5][2]);
for(int i = 0; i < 5; i++)
for(int j = 0; j < 2; j++)
p[i][j]= (i+1) * (j+1);
现在,您可以创建一个由相同类型的指针表示的新数组,并重新分配原始指针(此处可以使用连续内存块来复制元素(:
int (*p2)[2] = new (int [6][2]);
memcpy(&p2[0][0], &p[0][0], sizeof(int) * 5 * 2);
delete[] p; // don't forget to clean up
p = p2;
但是现在有一些未初始化的内存可能会导致未定义的行为,因此:
// initialize new row:
for(int j = 0; j < 2; j++)
p[5][j]= 6*(j+1);
现在您可以打印值并销毁新创建的数组(这可以使用指针p2
也可以使用指针p
完成(:
for(int i = 0; i < 6; i++)
for(int j = 0; j < 2; j++)
std::cout << p[i][j] << ' ';
delete[] p;
打印1 2 2 4 3 6 4 8 5 10 6 12
:)
PS:如果您有未定义memcpy
的问题,请尝试#include <cstring>
相关文章:
- 使用新行和不使用新行读取文件
- 在动态分配的二维矩阵中插入新列
- 如何为const char double指针(使用新的)动态分配内存
- C 标准是否可以保证使用新的动态分配
- 使用新运算符C 检测动态分配
- 通过新行不使用字符串流将C 字符串分配
- 如何使用64-Linux上的C 中的新操作员动态分配大型内存,例如10 g
- 在类方法中使用新运算符动态分配内存的寿命和范围是多少
- 从动态分配的2D数组指针中获取行
- 具有新功能的 C++ 动态分配
- 在动态分配时,在免费存储上指向一个新地址是一种好的做法吗
- c++:执行动态分配的新运算符检查内存安全性
- 新的动态分配与正常分配
- 可以将成员变量 (CBrush *) 分配给在类构造函数中动态分配的内存,并出现新的原因问题
- 使用 CPP 在之后添加新行的动态分配
- 动态分配正确对齐的内存:char数组上的新表达式是否合适
- 在c++中动态分配2D阵列的行
- C++动态分配,是我使用新的正确方法
- 动态分配一个新的整数数组
- 在构造函数中动态分配新对象