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

据我所知,staticArrayA的值是指向数组中第一个元素的指针,但是表示这个基址的指针的行为类似于常量指针,不能更改,在这种情况下,您不能设置:
staticArrayA = staticArrayB;

但是动态数组呢?如果它们都只是指向内存中连续字节块的指针,那么为什么不能将它们设置为彼此相等呢?
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的所有元素复制到array中,然后使用realloc()来减小大小,我只是希望有人能对动态数组的本质给出一些见解,并解释一些这种行为,告诉我为什么赋值不起作用,或者在某些情况下它起作用。另外,我可以让函数返回一个int*并将array=设置为这个函数调用,这是可行的,但是为什么我不能在函数内部执行呢?谢谢你的时间和帮助。

最佳答案

让我们看看在compressArray结束时实际发生了什么:

array = nuArray;

在这个语句之后,array现在指向的内存与nuArray指向的内存相同。以前指向的内存现在可以在array内部访问,但是compressArray中的array仍然指向原始内存块。这是因为这个块的地址是传递给main的,而不是compressArray变量的地址。
free(nuArray);

这将释放array指向的内存。但由于nuArray包含与array相同的值,即nuArray指向的内存块的地址,现在nuArray指向已释放的内存块,访问它是未定义的行为。
当函数返回时,main中array的值不变。那是因为传入了array的值。
要按预期工作,array需要获取指针的地址(ancompressArray)并更改指针指向的内容:
void compressArray(int **array, int n) {    // "array" is a pointer to an array
    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) {            // note how we're now accessing the array
            nuArray[index] = (*array)[i];  // same here
            index++;
            size--;
        }
    }
    nuArray = realloc(nuArray, sizeof(int) * size);
    assert(nuArray != NULL);
    free(*array);     // We don't need the memory array pointed to anymore, so free it
    *array = nuArray; // This changes "array" in main.  Also, don't free nuArray,
                      // otherwise *array will also point to freed memory
}

然后你这样称呼它:
compressArray(&array, 10);
// print the new contents of array
free(array);    // We're done with it now, so free it

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

10-09 00:13