如何在C中获取动态分配的二维数组的长度

时间:2010-09-12 03:48:42

标签: c pointers multidimensional-array size

问题是如何在C中获得动态分配的2D数组的长度?我认为下面的代码应该得到行数,但事实并非如此。

char** lines;
/* memory allocation and data manipulation */

int length; //the number of rows

length = sizeof(lines)/sizeof(char*);

对此有何想法?

6 个答案:

答案 0 :(得分:6)

您无法获得C(2D或其他)中动态分配的数组的长度。如果您需要该信息,请在最初分配内存时将其保存到变量(或至少计算它的方式),并将指针传递给内存和内存的大小。

在您的测试用例中,sizeof返回lines类型的大小,因此您的长度计算相当于sizeof(char**)/sizeof(char*),并且可能会有1的微不足道的结果{1}},永远。

答案 1 :(得分:2)

您无法找到动态分配的数组大小。 如果需要将此数组传递给函数,请创建包含数组及其大小的结构。

struct Line {
    char** text;
    uint32_t size;
};

答案 2 :(得分:2)

mallocnew的底层实现必然会跟踪为您的变量分配的内存大小。不幸的是,没有标准的方法来获得分配块的大小。原因在于并非所有内存块都是动态分配的,因此具有仅适用于动态分配的功能并不是那么有用。

void fillwithzero(int* array) {
    unsigned int size = getsize(array); // return 0 for statically allocated array ??
    for(int i = 0; i < size; i++) {
        array[i] = 0;
    }
}

让我们说我们有getsize函数能够神奇地获取动态分配的数组的大小。但是,如果发送静态数组的指针,或通过其他方式(例如外部函数)分配给fillwithzero的某个数组,则此函数将不起作用。这就是为什么接受数组的大多数C函数都需要调用者发送数组的大小或最大大小以及数组本身。

答案 3 :(得分:1)

您无法在C中获得动态分配的数组的长度。

当你分配它时,你需要在某个地方存储那个长度,所以你知道它有多长。

例如:

int length = ...;
lines = malloc(length*sizeof(char*));

如果需要将其传递给其他函数,则需要将它们作为单独的参数传递,或者定义包含长度和lines指针的结构类型。

答案 4 :(得分:0)

你将它与你的价值一起传递。没有办法找到它。

答案 5 :(得分:0)

您可以获得动态分配内存的长度, IF 您使用 NONPORTABLE MSVC / MinGW扩展程序:

#include <malloc.h>
char *m = malloc(1234);
#ifdef __int64
printf("m size = %lu bytes", _msize(m) );
#endif