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

标签 c arrays pointers int

我想动态地将数字添加到 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/

相关文章:

我可以这样投指针吗?

c - 使用 C 将 CSV 文件解析为结构

javascript - 使用 javascript 更改 JSON 结构

c - 在C中,指针的地址可以为0吗?

java - 重复数组列表

arrays - 稀疏时,BASH 空间中的整数索引数组是否有效?

C - 递增和递减指针,然后检索值

c - Prime Sieve 无输出

c - 如何判断程序崩溃

c - 为什么我可以在不包含 ctype.h 的情况下进行链接