Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指定初始值设定项,浪费未使用和不必要的内存?如何仅分配阵列中所需的部分?_C - Fatal编程技术网

C 指定初始值设定项,浪费未使用和不必要的内存?如何仅分配阵列中所需的部分?

C 指定初始值设定项,浪费未使用和不必要的内存?如何仅分配阵列中所需的部分?,c,C,我想使用指定的初始值设定项,但是其他未初始化的索引呢 他们也在浪费我的记忆吗 例如: 编辑部分:{ int数组[590]={[2]=1} 注意:我不使用其他数组索引,就像这个例子一样,我只想使用一个,但我会为另一个索引分配内存 (好吧,我知道这个例子很模糊,我不想要一个int或任何其他类型,我不知道如何解释我想要的。但我认为解释它是没有必要的,因为我的问题不是“如何实现这一点”,我的问题是“当我这样做时会发生什么?”或“它是如何实现的?”,非常感谢。) 这里面的记忆呢? 我浪费了590块内存,还

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

他们也在浪费我的记忆吗

例如:

编辑部分:{

int数组[590]={[2]=1}

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

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

这里面的记忆呢? 我浪费了590块内存,还是只有一块? 如果第一个是正确的,我怎么能只花一个呢

如果我这样做:

int数组[]={[2]=1[590]=2}

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

}


非常感谢

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


我认为,您需要的是一个哈希表或其他类型的关联容器,而C在其标准库中没有。您必须自己编写一个元素,或者查找其他人编写的元素。

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


我认为,您需要的是一个哈希表或其他类型的关联容器,而C在其标准库中没有。您必须自己编写一个数组,或者查找其他人编写的数组。

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

是的,在声明数组时分配内存,即使您没有初始化每个元素。如果您只想存储一个值,您需要一个变量,您也可以通过友好方式分配内存,但它需要大量指针和内存分配/管理函数(malloc、realloc、free等)

让我们问问编译器先生

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

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


另外,有许多“稀疏矩阵”C库;只需谷歌搜索“C库稀疏矩阵”。但是,对于一个包含591个元素的向量,它们完全是多余的。现在,如果你有10000个这样的向量,那就另当别论了。

让我们问问编译器先生

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

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


另外,有许多“稀疏矩阵”C库;只需谷歌搜索“C库稀疏矩阵”。但是,对于一个包含591个元素的向量,它们完全是多余的。现在,如果你有10000个这样的向量,那就另当别论了。

waste=allocate memory.waste=allocate memory。那么,如何通过友好分配来避免占用内存呢?MALLOC:分配内存请求字节大小,并返回一个指向分配空间的Ist字节的指针。CALLOC:为元素数组分配空间将其初始化为零并返回指向内存空闲:释放以前分配的空间REALLOC:修改以前分配的空间的大小。此链接用于动态内存分配教程。那么,我如何通过友好分配来避免占用内存呢?MALLOC:分配字节大小的内存请求,并返回一个指向分配空间的Ist字节的指针。CALLOC:为元素数组分配空间将其初始化为零并返回指向内存空闲:释放以前分配的空间REALLOC:修改以前分配的空间的大小。此链接用于动态内存分配教程。那么,如何实现我想要的呢?只分配我索引的一部分?那么,如何实现我想要的呢?只分配部分索引?您需要实现一个关联的容器。在标准C库中没有这样的东西,但是自己实现也不难。当然,对于您的示例中这样一个小阵列,这真的不重要,但我假设您计划使用更大的阵列。Kevin Little给了你一些很好的关键词,可以插入google…其余的关键词不会不初始化-它们会隐式初始化为0。C中的对象从不进行部分初始化,因此如果数组中的一个成员有一个初始化器,则整个数组都会初始化。@caf:I正确无误。在我发布我的答案之前,我在谷歌上做了一个快速的检查,但是我得到了相互矛盾的答案,所以我只做了一个最安全的假设:)你需要实现一个相关的容器。在标准C库中没有这样的东西,但是自己实现也不难。当然,对于您的示例中这样一个小阵列,这真的不重要,但我假设您计划使用更大的阵列。Kevin Little给了你一些很好的关键词,可以插入google…其余的关键词不会不初始化-它们会隐式初始化为0。C中的对象从不进行部分初始化,因此如果数组中的一个成员有一个初始化器,则整个数组都会初始化。@caf:I正确无误。在我发布我的答案之前,我在谷歌上快速搜索了一下,但是我得到了c