gpt4 book ai didi

c - C90中关于指针和malloc的问题

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:02 24 4
gpt4 key购买 nike

在 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;
}

如有任何错误,请原谅,但这是我第一次提出问题,我已尽最大努力使所有内容井井有条。

感谢阅读。

最佳答案

当你想重新分配它包含的数组时,你重新分配了错误的指针,你重新分配了指向父 Set 的指针。

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

应该是

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

关于c - C90中关于指针和malloc的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20877384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com