关于C90中指针和malloc的问题

时间:2014-01-02 06:16:17

标签: c pointers malloc

对于C来说,我是一个新手,在内存分配和指针方面似乎有一些问题。对于我的任务,我们必须使用数组创建动态集的ADT,为此我们需要大量使用指针,我觉得有点难以理解。

我创建了一个充当集合

的结构
struct Set{

    int arrelement; //the 'size' of the array
    int * arrvalue;; //the array
}

typedef struct Set *SetArray;

当我开始应用诸如Add(我在集合中添加一个唯一元素)或Cardinality(其中程序向我显示集合中元素的总数)等函数时出现问题。添加超过2次并尝试检索存储的数据供应垃圾变量后,添加似乎会使我的程序崩溃。

以下是相关功能的代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "Array.h"

    int size = 1; // similar to arrelement, to be used for realloc

    SetArray Create(){ // to allocate memory for the set

        SetArray sptr;
        sptr = malloc(sizeof(struct Set));
        sptr->arrvalue = malloc(sizeof(struct Set));
        sptr->arrelement = 1;
        return sptr;
    }

    SetArray Add(SetArray sptr, int x){

        if(Is_Element_Of(x, sptr)){ //function to keep elements in set unique.
                                         //Function works, which brings me to 
                                         //believe values are being stored
            puts("Value already exists, enter a unique value");
        }
        else{
            if(sptr == NULL){
                puts("Memory Allocation Failed. Shutting down.");
                exit(EXIT_FAILURE);
            }
        }

            sptr = realloc(sptr, size*sizeof(struct Set)); //reallocate memory
                                                             //for the 
                                                             //new element
            sptr->arrvalue[sptr->arrelement] = x;
            sptr->arrelement++;
            size++;

        return sptr;
        }



    SetArray Remove(SetArray sptr, int x){

        if(sptr == NULL){
            puts("Memory Allocation Failed. Shutting down.");
            exit(EXIT_FAILURE);
        }
        else if(!Is_Element_Of(x, sptr)){
            puts("Value is not in set");
        }
        else if(sptr->arrvalue == NULL){
            puts("Set is empty. Cannot remove that which does not exist");
        }
        else{
            sptr = realloc(sptr, size*sizeof(struct Set));
            sptr->arrvalue[sptr->arrelement] = '\0';
            sptr->arrelement--;
            size--;
        }


return sptr;
}

SetArray Clear(SetArray sptr){

    if(sptr == NULL){
            puts("Memory Allocation Failed. Shutting down.");
            exit(EXIT_FAILURE);
    }

    int i;
    for(i = 0; i < sptr->arrelement; i++){
        sptr->arrvalue[i] = '\0';
    }
    return sptr;
}

另外,不确定是否相关,但以防万一,这里是函数Is_Element_Of

int Is_Element_Of(int x, SetArray sptr){

    if(sptr == NULL){
            puts("Memory Allocation Failed. Shutting down.");
            exit(EXIT_FAILURE);
    }

    int flag = 0;
    int i;
    for(i = 0; i < sptr->arrelement; i++){
        if(sptr->arrvalue[i] == x){
            flag = 1;
        }
    }

    return flag;
}

请原谅我有任何错误,但这是我第一次问,我尽力保持一切井然有序。

感谢您的阅读。

2 个答案:

答案 0 :(得分:3)

当你想重新分配它包含的数组时,你正在重新分配错误的指针,你将指针重新分配给你的父集。

sptr = realloc(sptr, size*sizeof(struct Set));

应该是

sptr->arrvalue = realloc(sptr->arrvalue, (sptr->arrelement+1)*sizeof(int));

答案 1 :(得分:1)

我猜你的主要问题是:

sptr->arrvalue = malloc(sizeof(struct Set));

因为arravlue是int *,试试这个:

sptr->arrvalue = malloc(sizeof(int));

编辑:同样用于realloc