繁体   English   中英

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

[英]How to get the length of dynamically allocated two dimensional arrays in C

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

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

int length; //the number of rows

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

有什么想法吗?

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

在您的测试用例中, sizeof返回lines类型的大小,因此您的长度计算等于sizeof(char**)/sizeof(char*) ,并且可能总是具有1的平凡结果。

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

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

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函数都需要调用者发送数组的大小或最大大小以及数组本身。

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

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

例如:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM