2014-06-25 43 views
0

我将在c中有一个数组的数组,因为主数组中的每个数组都有一个特定的大小。例如: {{ A,B,C}, {A},{ 一,d}} 的 问题是,我不希望使用堆内存,并使用 “的malloc”,还应该不会浪费任何内存。例如,我不想使用下面的代码:如果你想使不同大小的数组的数组如何在c中创建一个不同大小的数组的数组?

char myArrays[][3] = { 
{a,b,c}, 
{a,null,null}, 
{a,d,null} 
} 
+0

检查这个问题和答案http://stackoverflow.com/questions/22745750/array-of-arrays-with-different-sizes ?? – pes502

+0

3字节并不是真的在浪费内存......你在实际项目中是否存在一些小内存,或者这是一个相当理论上的问题? – mafso

+0

精确的问题,什么是应该是一个B C D空等等,并添加您的问题的上下文。 – Yann

回答

5

,你需要做一个指针数组,像这样:

char *myArrays[] = { 
    (char[]){'a','b','c'}, 
    (char[]){'a'}, 
    (char[]){'a','d'} 
}; 

你不需要用空字符“填充”你的数组。

请注意,这种方法不提供一个简单的方法来找出内部数组的确切长度:sizeof运算符不会工作。如果你想知道内部数组的长度,或者添加某种(比如,'\0' S)的终止条目或增加长度的数组,像这样:

size_t myLengths[] = {3, 1, 2}; 

现在你可以遍历数组的数组像这样:

for (int i = 0 ; i != 3 ; i++) { 
    for (int j = 0 ; j != myLengths[i] ; j++) { 
     putchar(myArrays[i][j]); 
    } 
    putchar('\n'); 
} 

Demo on ideone.

+0

这真的有用吗?整齐。 –

+0

@PeterSchneider绝对是的!我添加了一个演示。 – dasblinkenlight

+3

为了澄清过去15年来一直生活在岩石中的人:该解决方案使用了C99标准中引入的_compound literals_的C概念。 (虽然不是必须使用它们,但也可以将每个数组声明为单个变量并获得相同的结果。) – Lundin

0

声明指针数组:

char* ptrArray [] = 
{ 
    array1, 
    array2, 
    ... 
}; 

要跟踪它们各自的大小,可以声明包含大小的相同大小的另一个数组,或者将数组嵌入结构中,其中大小是一个成员,指向另一个数组的指针。

+0

它可能意味着我应该声明每个数组,然后在_ptrArray_中使用它们,但是我只想在主数组中启动每个数组。 – rezCash

+0

@rezCash为了什么目的?你是否有理由想要将它们放在同一阵列中,还是你只是“感觉”这种方式? – Lundin

-1

现在在C++中,您可以制作矢量矢量。像下面这样。

std::vector< std::vector<char> > myArrays; 
myArrays.resize(3); 
myArrays[0].resize(3); 
myArrays[1].resize(1); 
myArrays[2].resize(2); 

但是这是C++而不是C.另外,std :: vector在后台使用堆内存。

但是,这是最接近你所要求的,我能想到的。

+0

问题是关于C,所以你的答案是离题和无关的。此外,OP还特意要求不使用堆内存的解决方案。 – Lundin

相关问题