在C ++中将静态数组传递给函数

5

使用定义的函数...

void func (int a [3]) { ... }

我希望能够像这样传递动态静态数组
func (new int [3] {1,2,3});

替代...

int temp [3] = {1,2,3};
func(temp);

这个在C++中可行吗?

在发帖之前,你应该真正尝试并自己进行研究。 - C0D3
请记住,C++不是垃圾回收的语言... - ixe013
@c0d3Junk13 我已经尝试过了,但我还没有找到一篇明确告诉我不能这样做的帖子。我只是不理解编译器为什么不能将其放在堆栈上。 - xori
@ixe013 但这在这里没问题,对吧?因为它在栈上,而不是堆上。 - xori
指向内存的指针被放置在堆栈上。内存本身没有被放置,您必须管理它。请遵循@JesseGood的建议。 - ixe013
显示剩余2条评论
3个回答

4
如果你有一个C++11编译器,func (new int [3] {1,2,3}); 可以正常工作(但请记住你需要负责delete内存)。使用gcc时,只需传递-std=c++11标志即可。
然而,建议使用std::array,这样就不需要使用new了: 示例
void func (std::array<int, 3> a)
{
}

int main()
{
    func({{1, 2, 3}});
}

“would work fine” 的意思是“代码可以运行并产生预期的输出,但由于示例中没有匹配的 delete 调用,因此会泄漏内存”。 - Ed S.
编译器会把那个声明放在堆上吗? - xori
@xori:std::array的一个实例在自动存储区(“栈”)上分配,但它动态分配其数据存储。不过你不必担心,因为它会在结束后自动清理。 - Ed S.
1
@EdS.: 如果您在堆栈上实例化std::array,则std::array的元素将位于堆栈上。请参见此处。它基本上是一个带有数组成员的结构体。 - Jesse Good
1
哦,哇,这个我不知道,谢谢。我不能说我曾经真正使用过std :: array,但我经常在这里浏览问题时学习新东西。再次感谢。+1 - Ed S.
显示剩余2条评论

2

我的编译器(带有CDT扩展的Eclipse Indigo)可以使用,但是它给出了一个警告,这意味着它可能不适用于所有环境:

只有在使用-std=c++0x或-std= gnu++0x(默认启用)时才可用扩展初始化列表

以下是我的测试代码:

void func (int a[3])
{
cout << a[2];
}

int main()
{
    func(new int[3]{1,3,8});
}

成功将“8”打印到控制台。


2

您的示例new int [3] {1,2,3}是可以运行的,但每次调用会在堆上分配一个数组。

您应该可以使用类型转换在堆栈上完成它:

func((int[]){1,2,3});

我相信(int[]){1,2,3}只存在于C语言中(它是一个复合字面量)。 - Jesse Good
@JesseGood GCC在C++中支持复合字面量,尽管语义与C中有些不同。 - scientiaesthete
1
它可以与 const 一起使用...例如 double arr_func( int n, const double * xs ){ }; arr_func( 3, (const double[]){1.0,2.0,3.0} ); - Prokop Hapala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接