指定的初始化器,浪费未使用的和不必要的内存?如何只分配数组所需的部分?

时间:2010-03-16 02:25:14

标签: c

我想使用指定的初始值设定项,但其他未初始化的索引呢?

他们也是在记忆吗?

例如:

编辑部分:{

int array [590] = {[2] = 1};

注意:我没有使用其他数组索引,就像这个例子我想只使用一个,但我会为另一个索引分配内存?

(okey我知道这个例子很模糊,我不想只有一个int或任何其他类型,我不知道如何解释我想要的东西。但我认为解释它没有必要,因为我的问题不是“怎么做到这一点”我的问题是“当我这样做时会发生什么?”或“如何实施?”,非常感谢。)

这个内存怎么样?  我浪费了590块内存,还是只有一块?  如果第一个是正确的,我怎么才能只花一个?

如果我这样做:?

int array [] = {[2] = 1,[590] = 2};

我会分配590块内存,还是只分配两块?

}

非常感谢!

3 个答案:

答案 0 :(得分:3)

让我们问一下Compiler先生!

#include <stdio.h>
int main( int argc, char ** argv )
{
    int array[] = {[2] = 1, [590] = 2};
    printf("sizeof(array) is %d bytes\n", sizeof(array));
}

调查显示:

$ gcc initsize.c
$ ./a.out
sizeof(array) is 2364 bytes

是的! 591 * 4 = 2364。

这里,您在堆栈上分配了一个591元素的整数数组。它分配;编译器不知道你可以用它做什么(例如,将它传递给它一无所知的库函数)。你告诉它它的大小是591个元素,它服从...

P.S。有许多“稀疏矩阵”C库;只是google的“C库稀疏矩阵”。但是,对于591个元素的向量,它们总是过度杀死。现在,如果你有10,000个这样的向量,那就是另一个故事。

答案 1 :(得分:1)

是的,您使用的声明将创建一个包含5个元素的数组,并且只将其中一个设置为值“1”。其余的将是未初始化的(我相信)。

我认为,你想要的是哈希表或其他类型的关联容器,C在它的标准库中没有。你要么自己写一个,要么找一个别人写的。

答案 2 :(得分:0)

当您声明一个数组时,即使您没有初始化每个元素,也会分配内存。如果你只想存储一个值,你需要一个变量,你也可以使用dinamically分配内存,但它需要一个很好的指针和内存分配/管理函数(malloc,realloc,free等)。