c - 在 C 中将动态数组设置为彼此相等

标签 c arrays pointers

int staticArrayA[10];
int staticArrayB[10];
int *dynamicArrayA = (int *)malloc(sizeof(int) * 10);
int *dynamicArrayB = (int *)malloc(sizeof(int) * 10);

据我了解,staticArrayA 的值是指向数组中第一个元素的指针,但是表示该基地址的指针的行为类似于 const 指针并且无法更改,在这种情况下,您不能设置:

staticArrayA = staticArrayB;

但是动态数组呢?如果它们都只是指向内存中连续字节 block 的指针,那么为什么不能将它们设置为彼此相等?

dynamicArrayA = dynamicArrayB;

看起来 dynamicArrayA 指向的地址现在与 dynamicArrayB 指向的地址相同。请给我一些见识。也许我错了,但这就是我试图做的:

/* remove any element that is 0 from array. n is size of array */
void compressArray(int *array, int n) {
    int size = n;
    int index = 0;
    int *nuArray = (int *)malloc(sizeof(int) * n);
    assert(nuArray != NULL);
    for (int i = 0; i < n; i++) {
        if (array[i] != 0) {
            nuArray[index] = array[i];
            index++;
            size--;
        }
    }
    nuArray = realloc(nuArray, sizeof(int) * size);
    assert(nuArray != NULL);
    array = realloc(array, sizeof(int) * size);
    assert(array != NULL);
    array = nuArray; //This doesn't seem to work
    free(nuArray);
}

int main(int argc, const char * argv[]) {
    int *array = (int *)malloc(sizeof(int) * 10);
    assert(array != NULL);
    for (int i = 0; i < 10; i++) {
        if (i % 2 == 0) {
            array[i] = 0;
        } else {
            array[i] = i;
        }
    }
    compressArray(array, 10);
    return 0;
}

我确信有更简单和更优雅的方法来编写函数,而且我知道我可以将 nuArray 的所有元素复制到数组中,然后使用 realloc() 来减小大小,但是,我只是希望有人能深入了解动态数组的本质并解释其中的一些行为,并告诉我为什么分配不起作用,或者是否存在它起作用的情况。另外,我可以让函数返回一个 int * 并设置 array = 到这个函数调用并且可以工作,但是为什么我不能在函数内部这样做呢?感谢您的宝贵时间和任何帮助。

最佳答案

if they are both just pointers to a contiguous block of bytes in memory, then why can't you set them equal to each other?

当然可以。您只需要了解后果即可。

int *dynamicArrayA = (int *)malloc(sizeof(int) * 10);
int *dynamicArrayB = dynamicArrayA;

现在 dynamicArrayBdynamicArrayA 指向同一个内存。您更改一个指向的值,更改也将通过其他指针可见。

dynamicArrayB[0] = 10; // dynamicArrayA[0] is 10.
dynamicArrayA[5] = 15; // dynamicArrayB[5] is 15.

如果这是你的目标,你可以毫无问题地做到这一点。

更新,回应 OP 的评论

线

array = nuArray; //This doesn't seem to work

compressArray 中本地更改 array 的值。这不会更改 mainarray 的值。

你必须想出一个不同的方法来将 nuArray 返回给 main

该问题的一个解决方案是将 compressArray 的返回类型从 void 更改为 char* 并返回 nuArray 来自函数。

关于c - 在 C 中将动态数组设置为彼此相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33274281/

相关文章:

将字符串复制到动态二维数组中

c++ - 如何对设备执行非阻塞写入?

Java 多态性将子类型相互数组

C 指针 - 非常基本的

C++:传递数组与传递数组指针一样吗?

c - 丑陋的 C 结构分配的现代 C++ 模式

C - 无法打印动态数组值

arrays - 在 mongoose 中查询数组返回空数组

javascript - 如何使这个数组展平函数在 JavaScript 中递归运行?

c++ - 如何更新指针集 C++?