`
totoxian
  • 浏览: 1074345 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

如何在C++中动态分配二维数组

阅读更多
这个问题应该是我以前在CSDN蹭分时回答次数比较多的一个问题了,我的回答一般是三种方法:(1)用vector的vector,(2)先分配一个指针 数组,然后让里面每一个指针再指向一个数组,这个做法的好处是访问数组元素时比较直观,可以用a[x][y]这样的写法,缺点是它相当于C#中的一个锯齿 数组,内存空间不连续。(3)直接分配一个x*y大小的一维数组,这样保证空间是连续的,但访问数组元素不直观。对于我这个“经典”回答,我那时还一直是 挺得意的,至少从蹭分的角度来看,这样回答还是很有效的。

  今天在ChinaUnix论坛闲逛时看到一个贴子,再次证明了我在C++方面才疏学浅。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void **darray_new(int row, int col, int size)
{
void **arr;

arr = (void **) malloc(sizeof(void *) * row + size * row * col);
if (arr != NULL)
{
void *head;

head = (void *) arr + sizeof(void *) * row;
memset(arr, 0, sizeof(void *) * row + size * row * col);
while (row--)
arr[row] = head + size * row * col;
}
return arr;
}

void darray_free(void **arr)
{
if (arr != NULL)
free(arr);
}
嗯,连续分配内存,而且可以用a[x][y]的方式来访问!可谓二维数组动态分配的绝妙方法!这段程序是C的,似乎要改成支持对象分配的C++版也不是什么难事(不过估计得用上placement new吧,嗯,需要再思考一下……)。

2007-06-13 12:38 补充:

  经过试验,C++版出炉了:)关键点还是在于placement new和显示的析构函数调用,用于保证对象可以正常的构造和析构。
  这个实现也还是有不少缺点的,比如,数组的大小必须记住,才能保证析构所有对象。不过这点可以通过改进分配方法算法,把数组大小也用一点空间保存起来。
  另一个缺点是,从语法上看,很容易让人误把darray_new返回的指针以为是数据区的起始地址,从而可能导致一些逻辑错误。

#include <iostream>
#include <cstdlib>
#include <new>

template <typename T>

T **darray_new(int row, int col)
{
int size = sizeof(T);
void **arr = (void **) malloc(sizeof(void *) * row + size * row * col);
if (arr != NULL)
{
unsigned char * head;
head = (unsigned char *) arr + sizeof(void *) * row;
for (int i = 0; i < row; ++i)
{
arr[i] = head + size * i * col;
for (int j = 0; j < col; ++j)
new (head + size * (i * col + j)) T;
}
}
return (T**) arr;
}

template <typename T>
void darray_free(T **arr, int row, int col)
{
for (int i = 0; i < row; ++i)
for (int j = 0; j < col; ++j)
arr[i][j].~T();
if (arr != NULL)
free((void **)arr);
}

2007-06-13 21:00补充
本文仅为技术层面的讨论,实践中考虑用
boost::multi_array之类的现成的解决方案可能会更有效。
分享到:
评论

相关推荐

    关于C++动态为二维数组分配空间的问题

    通过上述介绍,我们可以看到在C++中动态分配二维数组并不复杂,但需要仔细处理指针和内存管理。无论是逐行分配还是一次性分配,都需要确保正确的内存分配和释放,以避免程序出现错误或内存泄漏等问题。希望本文能够...

    C语言动态分配二维数组

    本文将详细介绍如何在C语言中动态分配二维数组,并通过具体的代码示例来解释这一过程。 ### C语言动态分配二维数组 #### 标题解读: 标题“C语言动态分配二维数组”直接指出了本文的主要内容是关于在C语言环境下...

    JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例

    例如,如果你有一个C++函数接收二维数组并返回二维数组,你可以这样在Java中定义: ```java public interface MyDLL extends Library { // 定义C++函数原型 int processArray(int[][] input, int[][] output); } ...

    c#调用c++DLL,dll有二维数组

    标题中的“c#调用c++DLL,dll有二维数组”意味着我们将在C++的DLL中定义一个二维数组,然后在C#中调用该函数并处理这个数组。在C++中,二维数组通常以指针的形式传递,因为C++不支持引用参数。而在C#中,我们通常...

    c++动态创建二维数组

    在 C++ 中,动态创建二维数组是一种常用的技术,能够满足程序的需求。通过使用指针数组,可以实现动态的二维数组创建。下面将详细介绍动态创建二维数组的方法和技术。 指针数组和数组指针的区别 在 C++ 中,指针...

    C++动态二维数组的申请、赋值、使用、释放以及作参数示例

    以下是一些示例代码展示如何打印动态二维数组中的所有元素: ```cpp for (int i = 0; i ; i++) { for (int j = 0; j ; j++) { cout [i][j] ; // 输出当前元素 } cout ; // 换行 } ``` #### 五、动态二维数组...

    C++中二维数组的动态分配

    通过上述两个示例,我们可以看到在C++中动态分配二维数组的基本方法。需要注意的是,在分配内存之后,一定要记得释放内存,避免内存泄漏问题。此外,当涉及到复杂的多维数组时,合理地组织代码结构也非常重要,以...

    动态二维数组的应用

    在C++中,动态二维数组的初始化通常有两种方式:一重指针和一维数组。这两种方法都可以创建二维数组,但实现方式和内存管理有所不同。 1. **一重指针实现**: 使用一重指针实现动态二维数组时,首先分配一个指向...

    c++ 二级指针与二维数组之间值操作

    二级指针常用于管理动态内存分配的多维数组,尤其是在处理二维数组时,能提供灵活且高效的访问方式。本示例通过一个简单的6行代码展示了如何使用二级指针对char类型的二维数组进行值操作。 二维数组在C++中本质上是...

    动态生成二维数组,vs2005例程

    在C++编程中,动态生成二维数组是一种常见的内存管理技巧,尤其在处理不确定大小的数据集时。本例程“动态生成二维数组,vs2005例程”着重讲解如何在Visual Studio 2005环境下创建和管理这类数据结构。下面我们将...

    C++二维数组编程实例.zip

    6. **动态分配二维数组**: 当数组大小在编译时未知时,可以使用动态内存分配创建二维数组。 ```cpp int rows, cols; cin &gt;&gt; rows &gt;&gt; cols; int **arr = new int*[rows]; for(int i = 0; i ; i++) { arr[i] =...

    动态开辟二维数组.doc )

    在编程领域,特别是在C++中,动态开辟二维数组是一项基本而重要的技能。本文将基于提供的文件信息,深入探讨如何使用C++中的`new`关键字以及`vector`容器来实现这一功能。 #### 一、使用`new`关键字开辟二维数组 ...

    二维数组的动态分配和释放

    通过以上介绍可以看出,在C和C++中动态分配二维数组有多种方法,选择哪种方法取决于具体的应用场景和个人偏好。无论是C语言还是C++,都提供了强大的工具来管理内存,但同时也要求开发者对内存管理有深入的理解,以免...

    调用形参为二维数组的函数

    在C/C++等语言中,处理二维数组时,我们通常会遇到如何通过指针来操作它们的问题,特别是当涉及到函数调用时。本篇将详细讨论如何动态创建指针数组,并将其作为实参传递给形参为二维数组的函数。 首先,让我们理解...

    C++中实例三维动态数组建立

    释放内存的顺序与分配相反,先释放每个二维数组,然后再释放整个数组: ```cpp for (int i = 0; i ; ++i) { delete[] arr[i]; } delete[] arr; ``` 在实际应用中,我们可能还需要考虑其他因素,如异常安全性和...

    C++二维数组的动态分配

    C++中动态分配一维数组是十分常见的事,但会分配一维数组的人并不一定会分配二维数组。因为我想,不到特殊情况,我们可能很少想过要使用动态分配的二维数组。但不管怎么样,只要你是第一次想试着去分配一个二维数组...

    C++将文档文件变为二维数组

    这个过程的关键在于理解如何动态分配二维数组以及如何使用`ifstream`类读取文件。动态分配二维数组时,先分配一维指针数组,然后对每个元素再分配一维数组。这样,你可以根据需要灵活地调整数组的大小。使用`...

    C/C++动态二维数组 动态数组及文件操作 大学程序设计

    在C++中,静态二维数组需要在声明时指定大小,而动态二维数组则可以在运行时根据需要分配内存。在这个程序中,`float **A` 和 `float **b` 表示动态二维数组。`new` 运算符用于动态分配内存,例如 `*A = new float[N...

    c程序将表格数据读取到二维数组

    C 语言是一种广泛使用的编程语言,它可以用于读取 Excel 表格数据并将其存储到二维数组中。下面我们将详细介绍如何使用 C 语言实现此功能。 标题解释 "c 程序将表格数据读取到二维数组" 这个标题说明了我们需要使用...

Global site tag (gtag.js) - Google Analytics