[英]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;
};
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函数都需要调用者发送数组的大小或最大大小以及数组本身。
您无法在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.