首先,我想说我确实在搜索,但我不明白为现有问题提出的解决方案。
这是我的问题。
Array *create()
{
static Array *arr1;
void *arraypointer;
if ((arraypointer = (Array *) malloc(sizeof(Array))) == NULL) {
printf("Array not created because no memory is available. \n");
} else {
arraypointer = arr1;
printf("Array created successfully. \n");
}
return arr1;
}
我假设这很好。现在,我想在数组中添加一些东西,所以显然我需要增加内存的大小。目前,我有这个。
void add(Array S[], Item x)
{
static Array *arr1;
void *arraypointer;
arraypointer = (Array *) malloc(sizeof(Array) + 1);
if (is_element_of(x, S) == true) {
printf
("Item already exists in array and therefore it can't be added. \n");
} else {
strcpy(S->arr1[S->s].sinput, x.sinput);
S->arr1[S->s].iinput = x.iinput;
S->s++;
printf("Item added successfully. \n");
}
}
我觉得这不好,虽然我不确定我该怎么做。我得到的警告是在Add方法中没有使用arr1和arraypointer。
我该怎么办?
由于
P.S。如果你保持简单,我将不胜感激,因为我仍然试图围绕这个malloc事物。
答案 0 :(得分:0)
使用malloc
分配内存并在之后调整大小后,您必须使用realloc
。否则,如果再次使用malloc
,您将获得一个全新的数组。此外,如果您忘记调用free
,您将收到内存泄漏,b / c“旧”数组未被释放。使用realloc
保留当前数组的内容。
另请查看此相关问题:Differences between using realloc vs. free -> malloc functions
答案 1 :(得分:0)
我认为这很好。
不,不是,抱歉。仔细查看您的代码:假设malloc
成功,首先,它将新分配的内存区域分配给arraypointer
(实际上没有理由成为void *
,您应该制作它Array *
),然后将arr1
分配给arraypointer
。之后,您刚刚丢失了对先前分配的块的引用。因此,您的程序包含内存泄漏。
我没有看到使用arr1
的重点,我无法理解你为何选择static
。为什么不这样呢?
Array * create()
{
Array *arraypointer;
if ((arraypointer = malloc(sizeof(*arraypointer))) == NULL) {
printf("Array not created because no memory is available. \n");
} else {
printf("Array created successfully. \n");
}
return arraypointer;
}
您进入add()
的警告是因为您实际上并未使用arr1
或arraypointer
:您只是使用S
。在函数的代码中没有任何地方使用这些变量。我猜你想在这里使用realloc
,但很难说,因为你没有向我们展示Array
的结构定义。
答案 2 :(得分:0)
这与你的不同,但感觉如下
typedef int Item;
typedef struct da {
size_t s;//now size of array
Item *arr;//dynamic array
} Array;
Array *create(void){
Array *ap;
if((ap = malloc(sizeof(Array)))== NULL){
fprintf(stderr, "Array not created because no memory is available. \n");
} else {
fprintf(stderr, "Array created successfully. \n");
ap->s = 0;
ap->arr = NULL;
}
return ap;
}
bool is_equal(Item x, Item y){
return x == y;
}
bool is_element_of(Item x, Array *S){
size_t i;
for(i = 0; i < S->s ; ++i){
if(is_equal(x, S->arr[i]))
return true;
}
return false;
}
void add(Array *S, Item x){
if (is_element_of(x, S) == true){
fprintf(stderr, "Item already exists in array and therefore it can't be added. \n");
} else {
S->arr = realloc(S->arr, (S->s + 1) * sizeof(Item));
if(S->arr == NULL){
fprintf(stderr, "Memmory could not allocate.\n");
} else {
S->arr[S->s++] = x;
fprintf(stderr, "Item added successfully. \n");
}
}
}