gpt4 book ai didi

c - 在c中动态增加数组(int *)的大小

转载 作者:行者123 更新时间:2023-12-04 12:50:12 24 4
gpt4 key购买 nike

我想动态地将数字添加到 c 中的数组中。我的想法是只分配一个大小为 + 1 的新数组,添加数字,释放根数组并将指针从 temp 更改为根数组。像这样:

void addNumber(int* a, int* size, int number)
{
*size = *size + 1;
int* temp = (int*)(calloc(*size, sizeof(int)));
int i, j = 0;
for(i = 0; i < *size-1; i++) {
if(a[i] < number) {
printf("add ai");
temp[j] = a[i];
j++;
} else {
printf("add number");
temp[j] = number;
}
}
if(j != *size) {
printf("add new number");
temp[j] = number;
}
free(a);
a = temp;
}

int main(int argc, char* argv[])
{
int n = 10;
int* a;
int size = 1;

a = (int*) (calloc(1, sizeof(int)));
a[0] = 1;

if(!contains(a, size, 2)) {
addNumber(a, &size, 2);
}

printArray(a,size);

return 0;
}

问题在于 addNumber 函数中的代码有效,*a 具有新数组的正确值。但是在 main 函数中数组 *a 的值为 1,0。所以没有添加新插入的值 2。为什么?找不到原因。

最佳答案

要动态更改数组大小,您可以使用 realloc()常规。除了更容易使用之外,它比顺序调用 free()malloc() 的方法更快。

保证重新分配的 block 将填充旧内存块的内容。

The problem is that in the addNumber function the code works and the *a has the right values of the new array

您的代码中存在两个主要缺陷。第一个是你的 addNumber() 例程没有返回新分配的内存块(因此它被泄漏),你应该使用双指针或返回新 block 作为函数结果。

而第二个是第一个的结果 - 在 a 被释放后,您继续写入它。

如果您更愿意坚持当前的方法,那么修改后的代码应该可以工作:

void addNumber(int** a, int* size, int number)
{
*size = *size + 1;
int* temp = (int*)(calloc(*size, sizeof(int)));
int i, j = 0;
for(i = 0; i < *size-1; i++) {
if((*a)[i] < number) {
printf("add ai");
temp[j] = (*a)[i];
j++;
} else {
printf("add number");
temp[j] = number;
}
}
if(j != *size) {
printf("add new number");
temp[j] = number;
}
free(*a);
*a = temp;
}

int main(int argc, char* argv[])
{
int n = 10;
int* a;
int size = 1;

a = (int*) (calloc(1, sizeof(int)));
a[0] = 1;

if(!contains(a, size, 2)) {
addNumber(&a, &size, 2);
}

printArray(a,size);

return 0;
}

关于c - 在c中动态增加数组(int *)的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39985106/

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