对于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;
}
请原谅我有任何错误,但这是我第一次问,我尽力保持一切井然有序。
感谢您的阅读。
答案 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