C/C++如何知道动态分配的数组有多长

Ven*_*tta 1 c c++ python memory-management dynamic-memory-allocation

这个问题困扰了我一段时间.

int* a = new int[n]例如,如果我这样做,我只有一个指向数组a开头的指针,但C/C++是如何知道的n?我知道如果我想将这个数组传递给另一个函数,那么我必须用它传递数组的长度,所以我猜C/C++并不知道这个数组有多长.

我知道我们可以char*通过查找NUL终结符来推断字符数组的结尾.但其他数组是否有类似的机制,比如int?同时,char可以不仅仅是一个字符 - 您也可以将其视为整数类型.那么C++如何知道这个数组的结束呢?

当我开发嵌入式Python时,这个问题开始让我更加困扰(如果你不熟悉嵌入式python,你可以忽略这个段落并回答上面的问题.我仍然会欣赏它).在Python中有一个"ByteArray",将这个"ByteArray"转换为C/C++的唯一方法是使用PyString_AsString()将其转换为char*.但是如果这个ByteArray中有0,那么C/C++会认为char*数组会提前停止.这不是最糟糕的部分.最糟糕的是,比方说我做了

char* arr = PyString_AsString(something)
void* pt = calloc(1, 1000); 
Run Code Online (Sandbox Code Playgroud)

如果st恰好从0开始,那么C/C++几乎可以保证消灭arr中的所有内容,因为它认为arr在出现NULL之后就会结束.然后它可能只是通过为pt分配一个内存树干来消灭arr中的所有内容.

非常感谢您的宝贵时间!对此,我真的非常感激.

Ign*_*ams 7

C/C++没有; 它的分配器(的一小段代码实现malloc(),free()它知道它有多长,等等).欢迎使用C/C++,无需担心长度.

还有PyString_AsStringAndSize().