提问人:Debuholden 提问时间:11/14/2023 更新时间:11/14/2023 访问量:66
是否可以在不显式定义变量来指定长度的情况下创建动态数组?
Is it possible to create a dynamic array without explicitly defining a variable to specify the length?
问:
我正在尝试创建一个动态数组,可以使用函数 & 进行修改。现在我目前拥有它的方式,我需要一个变量来跟踪它的大小。我对这个概念的实现是将数据/大小存储在结构中,如下所示:Array_Push(array, val)
Array_Del(array, index)
struct Array {
int *data;
int size;
}
为了读取实际的数组,您必须键入我认为有点多余的内容。array.data[i]
我的解决方案是尝试将数组的大小存储在不同的索引中。我不想将它存储在里面,因为这会造成很多混乱,所以我想尝试将其存储在 .一个明显的问题是它位于阵列之外。相反,我所做的是通过 创建一个数组。之后,我通过 增加指向它的指针。但是,当我尝试释放它时,我最终释放了非编辑内存。我目前的想法是,问题出在某个地方,当我调用函数内部时,它不会修改我的原始指针。如果是这种情况,那么我想知道如何解决这个问题。这是我的代码,以防万一:[0]
[-1]
[-1]
int *array = malloc(sizeof(int))
array += 1
free(array)
malloc()
malloc()
array.h:
#pragma once
#include <stdio.h>
#include <stdlib.h>
int *Array_Create() {
int *array = malloc(sizeof(int));
// If malloc fails to allocate memory
if (array == NULL) {
printf("Error creating array: malloc() failed to allocate memory");
exit(12);
}
array[0] = 0;
array += 1;
return array;
}
void Array_Push(int *array, int value) {
if (array[-1] == 0) {
array = malloc(sizeof(int));
} else {
// array = realloc(array, sizeof(int) * array[-1]);
printf("ERROR READING ARRAY SIZE IN: Array_Push()");
}
}
main.c:
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <dynamic_array.h>
int main() {
int *array = Array_Create();
printf("%d", array[-1]);
Array_Push(array, 1);
free((array - 1));
free(array);
return 0;
}
答:
你对数组的使用和建议你认为数组的各个元素可以被分配和释放,或者你对内存分配有一些其他概念上的错误。malloc
free
malloc
为您提供内存块的地址,并且您必须将该地址传递给 。不能将该块中的任何其他地址传递给 。可以将一个地址添加到地址并将其用于索引,但是,当您将地址传递给 时,必须通过减去 1 来重建原始地址。free
free
free
Array_Create
可以是:
int *Array_Create(void)
{
int *array = malloc(sizeof *array);
if (!array)
{
fprintf(stderr, "Error creating array: malloc failed to allocate memory.\n");
exit(EXIT_FAILURE);
}
array[0] = 0;
return array +1;
}
并且可以是:Array_Push
int *Array_Push(int *array, int value)
{
int *temp = realloc(array-1, (array[-1] + 1) * sizeof *temp);
// Note use of array-1 when passing address to realloc.
if (!temp)
{
fprintf(stderr, "Error growing array: realloc failed to allocate memory.\n");
exit(EXIT_FAILURE);
}
array = temp+1;
++array[-1];
array[0] = value;
return array;
}
释放数组时,应仅使用 ,而不应使用 。free(array-1)
free(array)
请注意,需要为 提供一个新值,因此我编写了它以返回该值。调用它时,应将其称为 。也可以将其写成接受指向 的指针,如 in 和 称为 。这需要对其代码进行相应的更改。Array_Push
array
array = Array_Push(array, value);
array
void Array_Push(int **array, int value);
Array_Push(&array, value);
也就是说,优秀的程序员会避免这种安排,因为设计、工程和质量的原因超出了这个答案的范围。在某些情况下可能会使用这种代码,但您通常希望避免这样的错误。
评论
exit(EXIT_FAILURE)
exit()
上一个:C - 写入访问冲突
评论
typedef struct { ... } array; array arr;
#define arr arr.data
arr[i]
array = malloc(sizeof(int));
Array_Push()
array
char
CHAR_MAX
int
INT_MAX
SIZE_MAX