如何获取动态分配数组的大小?含二维字符串数组实例问询
嘿,这两个问题在C语言开发里挺常见的,我来给你详细拆解一下:
问题1:如何获取动态分配数组的大小?
首先得明确一个核心点:C语言本身不会跟踪动态分配内存的大小。当你用malloc/calloc/realloc分配内存后,返回的只是一个指向内存块起始位置的指针——这个指针里并没有存储内存块的大小信息。所以没办法直接通过指针“查”到数组的大小,只能靠自己额外管理。
常见的解决方案有这几种:
手动保存大小变量:在分配内存时,把数组的大小存在一个变量里,之后直接用这个变量来获取大小。这是最直接、最可靠的方式:
size_t arr_size = 10; // 数组元素个数 int *dynamic_arr = malloc(arr_size * sizeof(int)); // 之后要用到大小时,直接用arr_size就行 printf("数组大小:%zu\n", arr_size);用结构体封装指针和大小:如果需要频繁操作动态数组,可以把指针和大小封装到一个结构体里,这样管理起来更安全,也不容易弄丢大小信息:
typedef struct { int *data; size_t size; } DynamicIntArray; DynamicIntArray arr; arr.size = 10; arr.data = malloc(arr.size * sizeof(int)); // 获取大小直接用arr.size用特殊标记结尾(仅适合特定类型):比如字符串数组可以用
NULL作为结尾标记,然后通过遍历计数来得到大小。但这个方法只适用于能找到明确结束标记的数组类型,不是通用方案:char *str_arr[] = {"a", "b", "c", NULL}; size_t count = 0; while (str_arr[count] != NULL) { count++; } // count就是数组大小
问题2:如何打印二维字符串数组的第一维度(数值3)?
先看你的代码:
char **a = malloc(3 * sizeof(char*)); a[0] = "asd"; a[1] = "fghj"; a[2] = "klzxc";
这里的char** a是一个指向指针的指针,malloc给它分配了能存3个char*的空间,但这个“3”的信息并没有存在指针a里。所以同样要靠自己管理,有两种可行的方式:
方式1:分配时直接保存维度值(推荐)
这是最稳妥的做法,在malloc的时候就把第一维度的大小存在变量里,之后直接打印这个变量:
size_t dim1 = 3; char **a = malloc(dim1 * sizeof(char*)); a[0] = "asd"; a[1] = "fghj"; a[2] = "klzxc"; printf("第一维度大小:%zu\n", dim1); // 直接输出3
方式2:添加结尾标记后遍历计数
如果之前没保存大小,可以给数组的最后一个位置加一个NULL标记,然后通过遍历直到遇到NULL来计数:
// 注意要多分配一个char*的空间来放NULL char **a = malloc(4 * sizeof(char*)); a[0] = "asd"; a[1] = "fghj"; a[2] = "klzxc"; a[3] = NULL; // 标记数组第一维度的结束 size_t count = 0; while (a[count] != NULL) { count++; } printf("第一维度大小:%zu\n", count); // 输出3
⚠️ 注意:不要用malloc_usable_size这类非标准函数,它是GNU扩展,跨平台兼容性差,而且它返回的是malloc实际分配的内存块大小(可能比你请求的大),不是你实际使用的元素个数,结果不可靠。
内容的提问来源于stack exchange,提问作者A6EE

