如何更改指针在 C 中的函数内指向的内容?

洛伦佐·巴蒂斯特拉

我正在尝试编写一个可调整大小的数组,该数组在满时会扩展。所有功能都在工作,但调整大小的一个不是。

int main(void)
{
   int arr[4];
   int *ptr = arr;
   initializeEmptyArray(ptr);
   insertAtIndex(ptr, 0, 4);
   insertAtIndex(ptr, 0, 3);
   insertAtIndex(ptr, 0, 2);
   insertAtIndex(ptr, 0, 1);
   resizeArray(&ptr);
   for (int i = 0; i < capacity; i++)
   {
       printf("%i", arr[i]);
   }
}

这会启动我的数组 [1,2,3,4],然后调用调整大小数组来测试它。

void resizeArray(int **arr)
{
    int *newArr = (int *)malloc(capacity * 2 * sizeof(int));
    for (int i = 0; i < capacity; i++)
    {
        newArr[i] = (*arr)[i];
    }
    for (int i = capacity; i < capacity * 2; i++)
    {
        newArr[i] = EMPTY;
    }
    free(*arr);
    *arr = newArr;
}

问题是arr我打印时的值不会更改为 [1,2,3,4,-1,-1,-1,-1] (-1 表示空)。如何更改指针以指向这个新数组?

容量代表阵列支持的元素数量,初始化为 4 EMPTY 定义为 -1,代表阵列中的一个空槽。

艾伦·温德

代码的两个主要问题是,arr它在堆栈上分配main(),然后free()resizerArray(). 这是一个缺陷,我修复了我的堆分配arr问题main()在您的循环中,您打印arr[i]但传递ptrresizeArray()更新的内容,但arr仍指向现在已释放的内存。我通过消除ptr变量解决了这个问题

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define EMPTY 0

void resizeArray(int **arr, size_t capacity) {
    int *newArr = malloc(2 * capacity * sizeof(int));
    // for (int i = 0; i < 2 * capacity; i++) {
    //  newArr[i] = i < capacity ? (*arr)[i] : EMPTY;
    // }
    memcpy(newArr, *arr, capacity * sizeof(int));
    memset(newArr + capacity, EMPTY, capacity * sizeof(int));
    free(*arr);
    *arr = newArr;
}

int main(void) {
    size_t capacity = 4;
    int *arr = malloc(capacity * sizeof(int));
    arr[0] = 1;
    arr[1] = 2;
    arr[2] = 3;
    arr[3] = 4;
    for (int i = 0; i < capacity; i++) {
        printf("before: %d\n", arr[i]);
    }
    resizeArray(&arr, capacity);
    capacity *= 2;
    for (int i = 0; i < capacity; i++) {
        printf("after: %d\n", arr[i]);
    }
}

我注释掉了 resizeArray 中的循环,这样你就可以看到你将如何做到这一点。代码打印:

before: 1
before: 2
before: 3
before: 4
after: 1
after: 2
after: 3
after: 4
after: 0
after: 0
after: 0
after: 0

双方resizeArray()并调用代码必须了解的因素2这不是一个伟大的设计。也许传递新旧容量?或者size_t *capacity如果您想对因子进行硬编码,则可以更新它resizeArray()请记住检查 的返回值malloc()以确保它没有失败。

有关realloc()调整堆分配内存大小的标准方法,以及calloc()如何获取预初始化内存请参见

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C中的函数内更改指针值

来自分类Dev

指向C ++中函数的指针

来自分类Dev

如何在C中获取指向函数的函数指针?

来自分类Dev

如何在C函数中通过++更改指针的值?

来自分类Dev

c指向函数的指针未更改

来自分类Dev

您可以从C中当前指向的函数中更改指向函数的指针吗?

来自分类Dev

指向C中内置函数的函数指针

来自分类Dev

指向C ++中的函数指针的指针

来自分类Dev

如何在C#中创建“指向函数指针的typedef”?

来自分类Dev

Typedef指向C ++中C函数的指针

来自分类Dev

函数的C ++指针参数,如何避免更改输入

来自分类Dev

C ++如何处理函数中指针和引用的更改?

来自分类Dev

如何指向C ++中的函数

来自分类Dev

C ++:指针指向的值更改

来自分类Dev

更改C中的指针

来自分类Dev

C ++如何使函数指针指向类方法

来自分类Dev

如何创建指向函数C ++的指针的线程

来自分类Dev

C ++如何创建指向函数的常量指针?

来自分类Dev

在C函数中传递指向数组的指针

来自分类Dev

从C ++中的函数返回指向数组的指针?

来自分类Dev

数组指针如何在 C 中工作以及如何更改指针

来自分类Dev

C ++:如何正确删除指向指向类析构函数中的指针的数组

来自分类Dev

C中的指针:函数内部的更改

来自分类Dev

C ++-指向函数内局部变量的指针

来自分类Dev

如何确保仅在c中的功能块内不能修改传递给函数的指针及其内容

来自分类Dev

如何在C中的未知类型数组中查找max元素(使用指向函数的指针)

来自分类Dev

如何更改指针数组的内容?

来自分类Dev

更改C ++中指针指向的地址

来自分类Dev

如何将指向“ DEFINED”常量的指针传递给C中的函数?

Related 相关文章

热门标签

归档