它不允许我将变量存储在结构中的数组中

时间:2013-12-28 08:10:38

标签: c arrays pointers struct

嘿伙计,所以我有这个程序,其基本功能是创建一个集并要求用户添加一个输入。然后程序将检查输入,以便如果该输入已经在程序中,它会要求用户输入单个输入。

这是我一直在使用的结构:

struct memory
{
    int num;
    char element[MAXNUMB];
};
typedef struct memory *Item;

这是创建功能:

Item Create()
{
   Item set;
   set=(Item*)malloc(sizeof(Item));
   set->num=0;
   return set;
}

这是添加功能:

void Add(Item S,int x)//add an element to set S
{
    Item set;
    int i,flags;
    flags=0;
    if(S==NULL)//gives error if set doesn't exist
    {
        printf("Memory Allocation failed. Goodbye!");
        exit(EXIT_FAILURE);
    }
    printf("Please enter an input: ");//takes input from user
    scanf("%d",&x);
    for(i=0;i<n;i++)//checking for similar inputs
    {
        if(set->element[i]!=x)
        {
            flags=1;
        }
        else
        {
            if(flags!=1)
                flags=0;
        }
    }
    while(flags==0)
    {
        printf("Error! Integer already exists! Please enter a different input: ");
        scanf("%d",&x);
        for(i=0;i<n;i++)
        {
            if(set->element[i]!=x)
            {
                flags=1;
            }
            else
            {
                if(flags!=1)
                    flags=0;
            }
        }
    }
    set->element[set->num]=x;//it is crashing on this line
    printf("x");
    n++;
    set=realloc(set,n*sizeof(Item));
    set->num++;
}

我的程序正在崩溃

set->element[set->num]=x;

如果你能就如何解决这个问题给我一些建议,我将不胜感激。感谢

4 个答案:

答案 0 :(得分:5)

这一行

set=(Item*)malloc(sizeof(Item));

应该阅读

set=malloc(sizeof(struct memory));

因为你想分配更多的内存而不仅仅是一个指针

答案 1 :(得分:5)

除了上一个答案(您还需要以同样的方式更改realloc),它看起来就像在Add函数中,

a)set未初始化

b)似乎没有声明n

c)x是一个按值传递的参数,您将覆盖调用scanf

的值

答案 2 :(得分:0)

您的分配错误:您typedef项目是指针,然后您为该指针分配内存,并错误地将其用于数据本身。尝试替换

Item set;
set=(Item*)malloc(sizeof(Item));

通过

Item set = malloc(sizeof(*set));

使用dereferenced变量本身作为sizeof()运算符的参数可确保malloc的内存确实是您尝试分配的内容。

另请注意,在C中不必转换返回值malloc(),因为void*可以隐含地转换为任何指针。但是,如果您希望代码也是有效的C ++,则需要保留强制转换。

答案 3 :(得分:0)

我修复了崩溃问题。我必须定义如下设置:

Item set=Create();

感谢您的帮助。