C/C++:如何在运行时检查数组是静态的还是动态的
C/C++: How to check if an array is static or dynamic during runtime
我想知道如何检查数组是静态的还是动态分配的。我在网上查找并在mysql源代码中找到了以下实现,我不知道为什么可以工作?(第 0303 行检查数组是否为静态(
/*
0301 Just mark as empty if we are using a static buffer
0302 */
0303 if (array->buffer == (uchar *)(array + 1))
0304 array->elements= 0;
这是 mysql 中 DYNAMIC_ARRAY 的定义:
341
342 typedef struct st_dynamic_array
343 {
344 uchar *buffer;
345 uint elements,max_element;
346 uint alloc_increment;
347 uint size_of_element;
348 } DYNAMIC_ARRAY;
你不能。
您在此处缺少一些上下文。在这种特殊情况下,已知array->buffer
指向(uchar*)(array + 1)
并静态分配,或者指向其他位置并动态分配。
但是,(uchar*)(array + 1)
并没有自动意味着某些东西是静态分配的。
这就像询问此函数如何找到数组的长度(也就是说它不会,除非数组以 0 结尾(:
int getArrayLength(int *a)
{
for(int i = 0; ; i++)
if(a[i] == 0)
return i + 1;
}
- 没有额外的信息。
对于 C 来说,数组只是一堆内存地址。 a[n]
实际上意味着(type(a))*((void*)&a+n*sizeof(a))
.它不能不关心它是如何(或是否(分配的,即使地址是否真实。
附加信息可能是:
- 该变量属于特定类型,其中包含可以检查所需信息的字段
- 这是您的情况:您提供的代码"知道"变量是
DYNAMIC_ARRAY
- 这是您的情况:您提供的代码"知道"变量是
- 从分配系统中获取提示
- 例如
free
和realloc
只应该使用malloc
之前给出的指针调用。但是,检查指针的有效性不是公共接口的一部分。- 但是,像
valgrind
这样的调试工具通常使用检查器包装函数以验证例程的使用
- 但是,像
- 例如
只是为了解释 mysql 源代码片段在做什么,这可能会对您有所帮助。
首先,它不是对静态分配数组的测试。 它试图测试数组和标头是否被连续分配(一个紧跟在另一个之后(。
if (array->buffer == (uchar *)(array + 1))
array->elements= 0;
这实际上是获取指向结构DYNAMIC_ARRAY
的指针,并检查数组的地址是否指向紧跟在结构本身之后的地址。
测试为真的一种方法是,如果结构和数组空间被分配到一个 malloc(( - 一个连续的块中。 例如:
DYNAMIC_ARRAY *dap = NULL ;
dap = malloc( sizeof(DYNAMIC_ARRAY) + arraylength ) ;
dap->buffer = (uchar *)(dap+1) ;
IMO是一段不安全的代码,因为它做出了一个危险的假设。
它假定两个单独的分配(一个是标头结构的分配,一个是数组空间的分配(不能在内存中相互跟随。 这超出了应用程序的控制范围,除非他们显式编写了自己的内存管理器来不这样做。
如果这个技巧在 mysql 源代码的其他地方使用,我会非常震惊,因为它只是在自找麻烦。
- std::向量与传递值的动态数组
- 将数组动态分配到具有指针参数的函数中
- 我可以以某种方式使我的矢量/数组动态更改装置数量吗?
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 为什么C 没有方便的方式来为多维数组动态分配内存
- 如何制作具有动态大小的数组?动态数组的一般用法(可能还有指针)
- c++中的数组动态内存分配
- 多维数组动态分配的内存图
- 如何在 c++ 中使用 2-D 固定数组为 4-D 数组动态分配内存
- C++ 我在数组/动态内存方面遇到了一些问题
- C++ 中从数组动态强制转换
- C++中高维数组动态内存分配的正确方法.
- 从 C++ 结构中包含的指针数组动态分配和访问内存
- 对象数组动态内存分配
- 为二维数组动态分配内存时出错
- 如何将2d数组动态分配给结构
- 为结构数组c++动态分配内存
- 将数组动态添加到多维数组
- 类中的类数组-动态数组(c++)有问题
- 分配对象数组动态冻结