gpt4 book ai didi

c - 将动态数组传递给 C 中的函数

转载 作者:太空狗 更新时间:2023-10-29 17:15:31 24 4
gpt4 key购买 nike

我正在尝试创建一个函数,该函数将数组作为参数,向其添加值(必要时增加其大小)并返回项目数。到目前为止,我有:

int main(int argc, char** argv) {
int mSize = 10;
ent a[mSize];
int n;
n = addValues(a,mSize);

for(i=0;i<n;i++) {
//Print values from a
}
}

int addValues(ent *a, int mSize) {
int size = mSize;

i = 0;

while(....) { //Loop to add items to array
if(i>=size-1) {
size = size*2;
a = realloc(a, (size)*sizeof(ent));
}
//Add to array
i++;
}
return i;
}

如果 mSize 足够大以容纳数组的所有潜在元素,则此方法有效,但如果它需要调整大小,则会出现段错误。

我也试过:

int main(int argc, char** argv) {
...
ent *a;
...
}

int addValues(ent *a, int mSize) {
...
a = calloc(1, sizeof(ent);
//usual loop
...
}

没用。

我假设这是因为当我调用 realloc 时,'a' 的副本指向别处 - 如何修改它以使 'a' 始终指向相同的位置?

我的做法是否正确?有没有更好的方法来处理 C 中的动态结构?我应该实现链表来处理这些问题吗?

最佳答案

这里的主要问题是您试图将 realloc 与堆栈分配的数组一起使用。你有:

ent a[mSize];

那是栈上的自动分配。如果您稍后想在此上使用 realloc(),您将使用 malloc() 在堆上创建数组,如下所示:

ent *a = (ent*)malloc(mSize * sizeof(ent));

以便 malloc 库(以及 realloc() 等)了解您的数组。看起来,您可能会感到困惑 C99 variable-length arrays真正的 dynamic arrays ,因此在尝试解决此问题之前,请务必了解其中的区别。

不过,实际上,如果您正在用 C 语言编写动态数组,您应该尝试使用 OOP-ish 设计来封装有关数组的信息并对用户隐藏它。您希望将有关数组的信息(例如指针和大小)合并到一个结构中,并将操作(例如分配、添加元素、删除元素、释放等)合并到与您的结构一起使用的特殊函数中。所以你可能有:

typedef struct dynarray {
elt *data;
int size;
} dynarray;

您还可以定义一些函数来处理 dynarrays:

// malloc a dynarray and its data and returns a pointer to the dynarray    
dynarray *dynarray_create();

// add an element to dynarray and adjust its size if necessary
void dynarray_add_elt(dynarray *arr, elt value);

// return a particular element in the dynarray
elt dynarray_get_elt(dynarray *arr, int index);

// free the dynarray and its data.
void dynarray_free(dynarray *arr);

这样用户就不必确切地记住如何分配东西或数组当前的大小。希望这能让您入门。

关于c - 将动态数组传递给 C 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/341282/

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