【问题标题】:C multidimensional array heap assignmentC多维数组堆赋值
【发布时间】:2013-08-22 22:53:05
【问题描述】:

我在 C 中有一堆多维数组。

它们看起来像这样:(它们是字符,因为 c 中的 int 占用 4 个字节的内存,而不是 1 个字节用于不用作字符串的字符)

char booting[96][25] = {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x06,0x7e,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} ... .. ..

它们有 2400 个字符长,我有很多。 如果我对其中几个这样做,它可以正常工作,我可以通过以下方式访问它们:

char current_pixel = booting[34][2];

但是在像这样定义了 9 或 10 个数组之后,虽然编译正常,但在运行时我得到了 StackOverflow 错误。

问题是:有什么更好的方法可以将它们分配到堆上并且仍然像堆栈上的普通数组一样继续访问它们?

ps。我环顾四周,但仍然没有找到我想要的东西。感谢您对我的包容!

【问题讨论】:

  • char (*booting)[25] = calloc(96,sizeof *booting);
  • 大多数编译器都有增加堆栈大小的方法。如果您真的想堆分配它们,那么问题是:它们是否都具有相同的形状或所有维度的大小都不同?
  • 它们的结构和大小相同,只是数据不同

标签: c arrays pointers multidimensional-array


【解决方案1】:

要么将它们声明为全局变量,要么声明为static,这样它们就不会占用堆栈空间:

static char booting[96][25] = { { 0x00, ... }, ... };

或者使用malloc()进行动态内存分配:

char (*booting)[25] = malloc(96 * sizeof(*booting));

【讨论】:

  • 他的代码有什么问题?他为什么要使用静态或malloc?只是char booting[96][25] = {{}...}不行吗?
  • @LidongGuo 如果它太大并溢出堆栈,则不会。
  • @NeilKirk 堆栈大小受操作系统或编译器限制?
  • 堆栈大小受操作系统限制。在linux中我认为你可以在内核编译时设置它!
  • 不幸的是我不能使用静态,因为它们是在主文件以外的文件中声明的。
【解决方案2】:
vector< vector< char > > booting(y_size, vector< char >(x_size, starting_value));

以这种方式访问​​(x 和 y 可能与您的预期相反)

for (int y = 0; y < y_size; y++)
{
    for (int x = 0; x < x_size; x++)
    {
        cout << booting[y][x];
    }
}

【讨论】:

  • 问题是 C,尽管标签最初也包含 C++。不要对这个答案投反对票,因为它使用 C++。
  • 没关系,我也可以用 c++ 编译。这是一个混合项目。
猜你喜欢
  • 1970-01-01
  • 2016-05-12
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2014-11-15
  • 1970-01-01
  • 2016-05-20
相关资源
最近更新 更多