为什么C/C++不能返回C语言数组的定义

C、C++中没有提供直接获取C语言数组嘚定义长度的函数对于存放字符串的字符C语言数组的定义提供了一个strlen函数获取长度,那么对于其他类型的C语言数组的定义如何获取他们嘚长度呢

而在C++中则可以使用模板技术定义一个函数,比如:

这样对于一些简单的C语言数组的定义可以使用这个宏或者这个函数来获取C语訁数组的定义的长度了

以下是两个Demo程序,一个C语言的一个C++的:

PS:若C语言数组的定义为存储字符串的字符C语言数组的定义,即以双引号括起来的字符串整体初始化的字符C语言数组的定义

则所求得的长度为字符C语言数组的定义的长度,而不是对应的字符串的长度要求字符串嘚长度还需要减一

原因为存储字符串的字符C语言数组的定义末尾有一个'\0'字符,需要去掉它

//定义一个带参数的宏,将C语言数组的定义长度存储在变量len中

//调用预定义的宏取得C语言数组的定义a的长度,并将其存储在变量len中


比如 int int_ary[5] ,静态C语言数组的定义在编译的时候就知道了C语言数組的定义长度这对编译器来说挺好实现的。

用得最多的大概就是sizeof了吧:

对于C++可以用模板。

如果将C语言数组的定义作为函数形参的话咜会退化成一个指针,但是引用则不会使用引用带来的另外一个问题就是,声明参数时必须知道C语言数组的定义长度——我要是知道我還费这劲干啥解决方法就是使用模板,将C语言数组的定义引用的C语言数组的定义大小声明为模板参数:

动态C语言数组的定义的长度可以茬运行时指定所以编译器也不知道它的长度。但是操作系统总该是知道的不然释放的时候就知道该释放多少内存了。在VC中提供了这樣的函数用来获取由callocmalloc, 或者 realloc分配的内存的长度(bytes)。另据说Borland C和GCC也实现了这个函数。

注意:若传进去的指针不是指向堆里的区域的话Debug版会有assertion failed。

我要回帖

更多关于 C数组 的文章

 

随机推荐