使用malloc()的未初始化数组

时间:2014-01-08 16:44:57

标签: c arrays

实际上,显然是显示功能。对不起,如果我浪费你的时间(我实际上没有把显示功能的代码放在这里,我的不好。但是,我确实学到了一些新东西,所以谢谢大家!

我创建了一个涉及表示一组整数的数组的结构。 当我第一次创建一个结构时,我使用malloc()为结构分配空间,从而为数组分配空间。

然而,问题在于,当我创建结构时,数组的第一个元素被赋予一个数字。但是,我想创建一个结构,其中的数组未初始化。

typedef struct set{
    int numberOfValues; /* The number of values in the set */
    int value[40]; /* the set */
} *Set; /* Set is thus a pointer to struct set */

Set aOfPStructs[4];

void create()
{
    static int setnum = 0;

    Set S; /* S is a pointer to struct set */


    if (setnum <= 4)
    {
        S = (struct set *) malloc(sizeof(struct set));
        S->numberOfValues = 0;

        aOfPStructs[setnum] = S;

        printf("The set's number is %d\n", setnum);
        setnum++;
    }
    else
        printf("Error. No more sets can be created.\n");
}

以上只是整个程序的一个片段,但任何其他代码都与问题tbh无关。

所以使用该代码,如果我要在结构中显示数组的内容,我将获得1个值。事实是,我没有向数组添加任何元素,所以此时我不应该得到任何值。我能解决这个问题吗?

任何帮助将不胜感激!谢谢!

编辑: 我试过memset(),但这不是我想要的。当我使用create()时,我想在数组值[]中使用0个元素,但是一旦我使用create函数,代码就会生成1个随机元素。

功能。显示元素似乎工作得很好。有趣的是,当我运行一个函数从数组中删除一个元素时,删除了额外的元素,只有在运行add()函数时再次添加。

编辑2: 添加了屏幕截图,以进一步解释我的问题。我感谢迄今为止的每一条评论以及未来的评论。

http://imgur.com/cza3ip6

编辑3: 好的,我现在使用memset()和初始化的概念。事情是,如果我想检查集合的元素数量,就在我创建它之后,我应该得到0,因为我没有添加任何元素,但是正在使用create生成元素...

4 个答案:

答案 0 :(得分:2)

我想你可能不明白“初始化”和“未初始化”是什么意思。

“未初始化”意味着“保留任何位模式,从最后一次使用此内存的计算或引导机器时都会遗留下来。”

“已初始化”仅表示您已分配了设定值。

malloc调用根据此定义为您提供未初始化的存储空间。所以你所看到的是你能得到的最好的。您正在打印由第一个数组槽中的任意位模式形成的整数。

对于它的价值而言,获得n int s(初始化为零)的预归零内存块的最简单方法就是说。

int *blk = calloc(n, sizeof(int));

答案 1 :(得分:0)

使用memset设置0结构中的所有数据。默认情况下,当您使用malloc时,您获得的内存不会被初始化:

S = (struct set *) malloc(sizeof(struct set));
memset(S, 0, sizeof(struct set));

答案 2 :(得分:0)

您尚未发布显示您的设置的功能。我想问题可能就在那里。也许您使用类似for(i=0; i <= S->numberOfValues; i++)而不是for(i=0; i < S->numberOfValues; i++)的内容,因此即使不存在,也要打印第一个元素。

答案 3 :(得分:0)

试试这个。它使用一种不同的方法来创建和初始化结构数组,但相关的一点是它使用memset来为struct array的每个元素初始化int数组:

#include<stdio.h>

typedef struct {
    int numberOfValues; /* The number of values in the set */
    int value[40]; /* the set */
}SET;

SET  set[4], *pSet; //initialize SET *, pSet to the first position of set

main() 
{
    int i;
    pSet= &set[0];
    for(i=0;i<4;i++)
    {
        memset(pSet[i].value, 0, sizeof(int)*40); //set all elements of member value to 0   
    }

}