Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么编译器不';是否在参数中传递数组char*arr[]的大小?_C++_Arrays_C++11 - Fatal编程技术网

C++ 为什么编译器不';是否在参数中传递数组char*arr[]的大小?

C++ 为什么编译器不';是否在参数中传递数组char*arr[]的大小?,c++,arrays,c++11,C++,Arrays,C++11,为什么编译器不在参数中传递数组char*arr[]的大小?我想获得通过参数传递的数组的大小,但我猜它不起作用,因为即使char*a[]是char**我的问题是为什么会这样,我能让它工作吗 #include <stdio.h> #include <stddef.h> #include <stdio.h> template<class T, size_t len> constexpr size_t lengthof(T(&)[len]) {

为什么编译器不在参数中传递数组char*arr[]的大小?我想获得通过参数传递的数组的大小,但我猜它不起作用,因为即使
char*a[]
char**
我的问题是为什么会这样,我能让它工作吗

#include <stdio.h>
#include <stddef.h>
#include <stdio.h>

template<class T, size_t len>
constexpr size_t lengthof(T(&)[len])
{
    return len;
}
void printarr(const char *a[]);

int main()
{
    const char *a[] = { "aba", "bd", "cd" };
    printarr(a);
}

void printarr(const char *a[])
{
    for(size_t i = 0, c = lengthof(a); i < c; i++) {
        printf("str = %s\n", a[i]);
    }
}
#包括
#包括
#包括
模板
constexpr尺寸和长度(t(&)[len])
{
回程透镜;
}
void printarr(const char*a[]);
int main()
{
const char*a[]={“aba”、“bd”、“cd”};
printarr(a);
}
void printarr(常量字符*a[]
{
对于(尺寸i=0,c=a的长度;i 

因为C++是标准继承的,因为C++继承了C的兼容性。 作为函数参数,数组被分解为指针


您确实希望使用类似于
std::vector
的东西。了解标准C++的更多内容。

从C开始就一直是C的一个特性,并被带入C++中。 对于字符串数组,解决方案是添加一个尾随空字符来标记结束

当C在古代的PDP计算机上启动时,可能是为了提高效率而进行的


使用strlen;或者更好的是std::string或std::vector。

C++是一种提供对系统资源的低级访问的语言。 处理器不处理对象,而是处理内存地址


如果您需要预定义结构,使用java、C++、Python或C++等LIBS,如STL.< /P> < P>,您可以使用与您在Time> < /Cult>函数模板中使用的相同技巧。

template<size_t len>
void printarr(const char* (&a)[len])
{
    for(size_t i = 0, c = lengthof(a); i < c; i++) {
        printf("str = %s\n", a[i]);
    }
}
模板
void printarr(常量字符*(&a)[len])
{
对于(尺寸i=0,c=a的长度;i
从语言的角度来看,数组没有长度;编译器无法读懂您的心思并决定数组的开始和结束位置,也无法浪费内存和处理来执行范围检查。

与数组长度最接近的是单个
new[]
调用已分配的连续内存空间数,但此类信息仅用于分配和释放内存:您希望在函数中处理的“数组”可能只是单个分配的一部分(例如,您可以分配内存来加载整个文本文件,并分别处理每一行).

我听说,C使用NTBSE的原因是PDP汇编使用了NTBSE。我无法想象空终止是为了提高效率,因为它…比存储长度效率低。在PDP-11上,它会为每个字符串购买一个字节的存储空间,代价是使大小查找线性化,从而导致子作用域在一般情况下需要分配,这使得表示包含ASCII NULL的字符串变得非常困难。这可能与此类似。PDP-11有64000字节的地址空间。这将在某种程度上使用内存映射进行扩展。PDP-11编程与今天的编程不同,在今天的编程中,应用程序路由nely只消耗1 GB内存。在那些日子里,字符串通常被限制在64K(2字节长度)。用空终止代替计数将减少一半到1字节。令人遗憾的是,考虑到硬件的根本变化,我们使用为古代计算机设计的开发工具。