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/