这个问题应该是我以前在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++函数接收二维数组并返回二维数组,你可以这样在Java中定义: ```java public interface MyDLL extends Library { // 定义C++函数原型 int processArray(int[][] input, int[][] output); } ...
标题中的“c#调用c++DLL,dll有二维数组”意味着我们将在C++的DLL中定义一个二维数组,然后在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++中,动态二维数组的初始化通常有两种方式:一重指针和一维数组。这两种方法都可以创建二维数组,但实现方式和内存管理有所不同。 1. **一重指针实现**: 使用一重指针实现动态二维数组时,首先分配一个指向...
二级指针常用于管理动态内存分配的多维数组,尤其是在处理二维数组时,能提供灵活且高效的访问方式。本示例通过一个简单的6行代码展示了如何使用二级指针对char类型的二维数组进行值操作。 二维数组在C++中本质上是...
在C++编程中,动态生成二维数组是一种常见的内存管理技巧,尤其在处理不确定大小的数据集时。本例程“动态生成二维数组,vs2005例程”着重讲解如何在Visual Studio 2005环境下创建和管理这类数据结构。下面我们将...
6. **动态分配二维数组**: 当数组大小在编译时未知时,可以使用动态内存分配创建二维数组。 ```cpp int rows, cols; cin >> rows >> cols; int **arr = new int*[rows]; for(int i = 0; i ; i++) { arr[i] =...
在编程领域,特别是在C++中,动态开辟二维数组是一项基本而重要的技能。本文将基于提供的文件信息,深入探讨如何使用C++中的`new`关键字以及`vector`容器来实现这一功能。 #### 一、使用`new`关键字开辟二维数组 ...
通过以上介绍可以看出,在C和C++中动态分配二维数组有多种方法,选择哪种方法取决于具体的应用场景和个人偏好。无论是C语言还是C++,都提供了强大的工具来管理内存,但同时也要求开发者对内存管理有深入的理解,以免...
在C/C++等语言中,处理二维数组时,我们通常会遇到如何通过指针来操作它们的问题,特别是当涉及到函数调用时。本篇将详细讨论如何动态创建指针数组,并将其作为实参传递给形参为二维数组的函数。 首先,让我们理解...
释放内存的顺序与分配相反,先释放每个二维数组,然后再释放整个数组: ```cpp for (int i = 0; i ; ++i) { delete[] arr[i]; } delete[] arr; ``` 在实际应用中,我们可能还需要考虑其他因素,如异常安全性和...
C++中动态分配一维数组是十分常见的事,但会分配一维数组的人并不一定会分配二维数组。因为我想,不到特殊情况,我们可能很少想过要使用动态分配的二维数组。但不管怎么样,只要你是第一次想试着去分配一个二维数组...
这个过程的关键在于理解如何动态分配二维数组以及如何使用`ifstream`类读取文件。动态分配二维数组时,先分配一维指针数组,然后对每个元素再分配一维数组。这样,你可以根据需要灵活地调整数组的大小。使用`...
在C++中,静态二维数组需要在声明时指定大小,而动态二维数组则可以在运行时根据需要分配内存。在这个程序中,`float **A` 和 `float **b` 表示动态二维数组。`new` 运算符用于动态分配内存,例如 `*A = new float[N...
C 语言是一种广泛使用的编程语言,它可以用于读取 Excel 表格数据并将其存储到二维数组中。下面我们将详细介绍如何使用 C 语言实现此功能。 标题解释 "c 程序将表格数据读取到二维数组" 这个标题说明了我们需要使用...