【问题标题】:Create static array of arrays with different lengths [closed]创建具有不同长度的数组的静态数组[关闭]
【发布时间】:2013-12-05 17:25:06
【问题描述】:

我需要在静态内存中创建数组数组,但行长不同。我可以在编译时计算每一行的大小,但我不知道如何写下来,或者是否可能。

有什么想法吗?在此先感谢...

【问题讨论】:

  • 使用指针数组。
  • Iarsmans:谢谢,我试过了。但是在代码内部,我不能在这个数组中静态分配内存。我不能使用动态分配,因为此时我没有,而且数组也不适合堆栈...

标签: c arrays static


【解决方案1】:

你不能有一个数组数组,因为数组只能有一种元素类型,而T[N]T[M] 是不同的类型。

但是,你可以有一个指针数组:

T a0[5], a1[7], a2[21], a3[2];

T * arr[] = { a0, a1, a2, a3 };

现在您可以使用arr[0][i] 等。

【讨论】:

  • 好的,谢谢,这确实有效,但是当我有很多 ak - f.e. k = 20,那么我必须写下所有 a0[...], a1[...], ..., ak[...],对吗?有没有办法用一些宏来创建它们?
  • 我们可以有数组数组,但需要满足的条件是每个数组的大小和类型必须相同。也就是说,如果我喜欢这样......“ typedef int a [5]; a arr[5]” 那么 arr 变量是 5 个数组的数组,每个数组是 5 个整数数组
【解决方案2】:

您可以使用通过复合文字初始化的指针数组

double* A[] = {
    (double[]){ init00, init012, [45] = init3, },
    (double[]){ init10, init11, init3 },
    (double[34]){ 0.0 },
};

只要您可以保证在编译时知道初始化器和大小,所有这些分配都将静态完成。复合文字避免了你必须声明临时变量和污染程序的命名空间。

【讨论】:

  • 这不起作用。铿锵声抱怨:pointer is initialized by a temporary array, which will be destroyed at the end of the full-expression。 gcc 似乎没有发出警告,但它应该仍然存在 - 您正在分配一个指向数组的指针,但该数组没有命名,因此它似乎不会在内存中持续存在。
  • @Josh,我不知道你有什么版本的clang,但这种行为是错误的。复合文字,就像其他对象一样,一直存在到声明它们的范围的末尾。所以在这里它们与A 具有相同的生命周期。唯一的困难是,如果在函数中将A 声明为static。那么你应该有一个错误“初始化程序不是常量”左右。
  • 经过更多研究,我认为您是对的。这似乎同意你的看法:drdobbs.com/the-new-c-compound-literals/184401404。我很困惑,因为这里似乎有人告诉我一些不同的事情:stackoverflow.com/questions/31212114
  • @Josh,是的,那里不同,因为它谈论的是另一种编程语言,即 C++。不要使用 C++ 编译器或其他方式编译 C 代码。
  • 我以前从未遇到过 C 和 C++ 之间的这种特殊差异。谢谢你启发我。令人沮丧的是,他们从 C++ 中删除了一个有用的 C 特性,并且没有提供一种优雅的替代方式来完成同样的事情。 (我目前正试图在 C++ 中完成同样的事情,因此很沮丧。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 2023-03-10
  • 2018-08-13
  • 2015-05-02
  • 2013-08-27
  • 2016-02-25
  • 2019-12-17
相关资源
最近更新 更多