Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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++ 新表达式是否会返回指向数组的指针?_C++_Arrays_Pointers_Types_New Operator - Fatal编程技术网

C++ 新表达式是否会返回指向数组的指针?

C++ 新表达式是否会返回指向数组的指针?,c++,arrays,pointers,types,new-operator,C++,Arrays,Pointers,Types,New Operator,在本文中,他解释说,在C语言中,当一个函数需要一个在编译时已知维数的数组时,声明它是一个主要的技术级错误 void process_array(int *ptr, size_t plen); 而不是 void process_array(int (*arr_ptr)[10]); 此外,他认为许多程序员不知道第二种选择,只知道第一种。他写道,造成这种行为的原因之一是,当一个数组需要动态分配并传递给第二个版本时,程序员不知道怎么做;他们非常习惯于int*p=malloc(sizeof(*p)*1

在本文中,他解释说,在C语言中,当一个函数需要一个在编译时已知维数的数组时,声明它是一个主要的技术级错误

void process_array(int *ptr, size_t plen);
而不是

void process_array(int (*arr_ptr)[10]);
此外,他认为许多程序员不知道第二种选择,只知道第一种。他写道,造成这种行为的原因之一是,当一个数组需要动态分配并传递给第二个版本时,程序员不知道怎么做;他们非常习惯于
int*p=malloc(sizeof(*p)*10)
返回
int*
。在C语言中,正如他所展示的那样

int (*arr_ptr) [10] = malloc(sizeof(*arr_ptr));

这让我想到了C++中如何做同样的事情。我知道我们有
std::array
std::vector
等,但我有兴趣了解
new
的用法。所以我试着这样做:

typedef int Array10[10];
Array10 *p = new Array10;    // error: cannot convert ‘int*’ to ‘int (*)[10]’
当我将
p
的类型更改为
int*
时,编译器(GCC 4.8.1)很高兴。我查阅了C++11标准(草案n3337,
§5.3.4/5
),以进一步了解这一点,它说:

当分配的对象是数组时(即使用noptr new declarator语法或新的type id或type id表示数组类型),新表达式将生成指向数组初始元素(如果有)的指针。[注:new intnew int[10]都有类型int*new int[i][10]的类型是int(*)[10]-结束注]

我了解
newint[10]
正在运行;我得到的应该使用
delete[]p
释放,而不是
delete p
。然而,我需要的似乎是后者,其中分配不是整数数组,而是作为单个/整个对象的数组本身

有办法吗?或者我试图做这件事本身就显示出对C++类型系统的误解?或者这是正确的,但标准根本不允许



旁白:当一个函数接受一个大小固定的数组时,如选项2所示,调用函数最好的方法是声明一个自动数组,而不是动态分配一个数组并担心清理。

如果我正确理解了您想要的内容,那么您可以使用std::array。比如说

{
    typedef std::array<int, 10> Array10;

    Array10 *p = new Array10;
    delete p;
}
{
typedef std::数组10;
阵列10*p=新阵列10;
删除p;
}

是的,事实上,您引用的标准文本中建议:

int (*arr_ptr)[10] = new int[1][10];

新表达式返回的指针类型为
int(*)[10]
,即指向10个int数组的指针。你需要<代码>删除[]/Cord>删除它。< /P>不。我在问题中明确地指出,使用标准C++库有解决办法,但我想只用语言语法来做,而不是它的库设施。更多的是理解C++类型系统的线条。@ LeunsS2K,这里理解的不是C++类型系统(好的,但不是关键问题);关键问题是
new
的语法。执行
new
某个数组类型可以获得指向该类型数组的第一个元素的指针,而
new
非数组类型可以获得指向非数组类型的整个对象的指针。是的,我同意,应该检查
new
的语法,而不是这里的一般类型系统。也同意下一点。该标准引用中更好的亮点是表示数组类型,这解释了数组10test@Cubbi:哈哈。。。也许。我已经忠实地按照文档中的格式进行了格式化,即黑体字和斜体字都来自标准,重点不是我的。答案在您引用的文本中:
int(*p)[10]=new int[1][10]
您也可以这样做:
int(*p)[10]=reinterpret_cast(::operator new(sizeof(int[10]))
@jrok:但这对我来说似乎是一种攻击;使用多维数组和
重新解释\u cast
。不知道,也许这不是黑客攻击。不是问题的完全复制品,但完全回答了这个问题+1不是我问的,而是很接近。它不仅仅返回指向数组的指针,它还返回指向数组指针的数组的第一个元素的指针,因此不能
删除它,而只能
删除[]
它。它返回指向数组的指针,它不返回指向“指向数组指针的数组的第一个元素”的指针。后者将是
新的(int(*[5])[5])
。正如您所说,它确实需要
[]
来删除。如果它是
int[2][10]
,它不会仍然返回
int(*)[10]
,它只不过是指向数组的第一个元素的指针(数组为10
int
s)。在前面的例子中,计数是1,但仍然是一个元素数组,因此必须使用
delete[]
。是的。“10整数数组”的第一个元素是10整数数组。此外,任何对象都可以被视为一个由1个元素组成的数组,不管它是什么类型的。