问题是如何在C中获得动态分配的2D数组的长度?我认为下面的代码应该得到行数,但事实并非如此。
char** lines;
/* memory allocation and data manipulation */
int length; //the number of rows
length = sizeof(lines)/sizeof(char*);
对此有何想法?
答案 0 :(得分:6)
您无法获得C(2D或其他)中动态分配的数组的长度。如果您需要该信息,请在最初分配内存时将其保存到变量(或至少计算它的方式),并将指针传递给内存和内存的大小。
在您的测试用例中,sizeof
返回lines
类型的大小,因此您的长度计算相当于sizeof(char**)/sizeof(char*)
,并且可能会有1
的微不足道的结果{1}},永远。
答案 1 :(得分:2)
您无法找到动态分配的数组大小。 如果需要将此数组传递给函数,请创建包含数组及其大小的结构。
struct Line {
char** text;
uint32_t size;
};
答案 2 :(得分:2)
malloc
或new
的底层实现必然会跟踪为您的变量分配的内存大小。不幸的是,没有标准的方法来获得分配块的大小。原因在于并非所有内存块都是动态分配的,因此具有仅适用于动态分配的功能并不是那么有用。
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