转换为常量类型,初始化数组

Posted

技术标签:

【中文标题】转换为常量类型,初始化数组【英文标题】:Converting to constant type, initializing an array 【发布时间】:2015-02-08 23:59:40 【问题描述】:

我有一个非常基本的问题:是否可以将 int 变量转换为常量,所以我可以静态初始化具有给定长度的数组(没有指针和新函数)。我只是好奇,我知道如何动态地做到这一点。 谢谢

【问题讨论】:

不,数组需要在编译时知道它们的大小,在运行时你无法解决这个问题。 即使您找到了解决方法,我也怀疑编译器会将其视为可变长度数组以外的任何东西。 我在问这个,因为我写的是 CUDA 程序。我想使用共享内存,但不确定是否可以动态分配,动态分配存在一些问题。 可能重复:***.com/questions/14417318/cuda-new-delete 您可以使用alloca() 在标准C 和C++ 的堆栈上分配动态内存量;检查CUDA是否支持它。请注意,返回的指针的生命周期绑定到调用alloca() 的函数,因此当该函数返回时指针变为无效! 【参考方案1】:

数组的大小必须是编译时常量,即它必须在编译时知道。您显然无法将编译时未知的内容转换为编译时已知的内容,因为您在编译时不知道它。这将如何运作,您是否希望价值能够及时返回?

如果您在编译时不知道所需的大小,请使用std::vectornot 指针和new

【讨论】:

【参考方案2】:

在评论中,您提到使用共享内存。一般来说,std::vector 适用于动态大小的数组。该类有一个分配器,并将在需要时增长数组并复制元素。这不适用于共享内存。共享内存是数组大小固定且指针在运行时确定的特殊情况。

即使你在编译时就知道共享内存段的大小,如下语句:

   char myData[100];

将为 myData 分配内存。共享内存是使用指针然后将其视为数组的好例子。例如,您可以这样做:

   int total = 0;
   int n = getSizeOfSharedMemorySomehow();
   char *myData = getSharedMemoryPointerSomehow();
   for (int i = 0; i < n; i++)
       total += myData[i];

【讨论】:

以上是关于转换为常量类型,初始化数组的主要内容,如果未能解决你的问题,请参考以下文章

静态常量整数数组

C语言数组的初始化表示方法

go语言之字符串指针数组切片

Go语言中复合的数据类型

求C语言代码

c数组