【发布时间】:2015-03-29 16:04:08
【问题描述】:
我正在尝试学习如何创建一个函数,该函数将采用动态 int 数组 (int arrayPtr = (int) malloc...) 并将其替换为另一个动态数组。这个新数组不仅具有不同的值,而且可能具有不同数量的元素。
从我的研究中,我了解到我需要将一个对我的数组指针的引用传递给这个函数,而不是指针本身 (&arrayPtr)。这意味着函数签名需要具有 int **arrayPtr 而不是 int *arrayPtr。
我觉得这对我来说很有意义;我们需要告诉arrayPtr指向内存中不同的位置,所以我们需要arrayPtr的内存地址而不是它的值(原始数组的内存地址);
我写了一个小测试程序来看看我是否理解,但我无法让它工作。使用调试,我观察到以下情况: 从函数内部, (int **arrayPtr) 不代表整个数组,而只是第一个元素。也就是说,如果我做*arrayPtr[0],我可以得到值500,但是*arrayPtr[1]是不可访问的内存。
这是我的测试程序:
#include <stdlib.h>
void replaceArray(int **arrayPtr, unsigned int arrayLength) {
int i;
int *tempArrayPtr;
tempArrayPtr = (int *)malloc(sizeof(int) * arrayLength);
for (i = 0; i < arrayLength; ++i) {
tempArrayPtr[i] = *arrayPtr[i] * 2;
}
free(arrayPtr);
arrayPtr = &tempArrayPtr;
return;
}
int main(int argc, char **argv) {
int i;
int arrayLength = 2;
int *arrayPtr;
arrayPtr = (int*)malloc(sizeof(int) * arrayLength);
for (i = 0; i < arrayLength; ++i) {
arrayPtr[i] = i + 500;
}
replaceArray(&arrayPtr, arrayLength);
exit(EXIT_SUCCESS);
}
该函数应该创建一个新数组,其中原始数组的每个元素的值加倍,并让调用函数中的 arrayPtr 变量引用新数组。然而,正如我所写的,当 replaceArray 函数尝试访问 *arrayPtr[1] 时,它会得到 SIGSEGV。
我意识到这个小演示程序并没有做任何需要我正在测试的行为的事情。只是为了让我通过一个简单的例子来理解这个概念。
由于这是一个很小的、微不足道的程序,我认为我接受的答案将包含此代码的完整工作版本。
【问题讨论】:
-
标准警告:请do not cast
malloc()的返回值。