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;
现在 dynamicArrayB
和 dynamicArrayA
指向同一个内存。您更改一个指向的值,更改也将通过其他指针可见。
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
的值。这不会更改 main
中 array
的值。
你必须想出一个不同的方法来将 nuArray
返回给 main
。
该问题的一个解决方案是将 compressArray
的返回类型从 void
更改为 char*
并返回 nuArray
来自函数。
关于c - 在 C 中将动态数组设置为彼此相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33274281/