我正在尝试学习如何创建一个将采用动态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。
我意识到这个小的演示程序不会做任何需要我测试的行为的事情。只是为了让我可以通过一个简单的例子来理解这个概念。
由于这是一个很小的琐碎程序,因此我觉得合理,因为我接受的答案将包含此代码的完整工作版本。
请参见下面的代码和内联注释。
#include <stdlib.h>
void replaceArray(int **arrayPtr, unsigned int arrayLength) {
int i;
int *tempArrayPtr;
tempArrayPtr = malloc(sizeof(int) * arrayLength); //do not cast
for (i = 0; i < arrayLength; ++i) {
tempArrayPtr[i] = (*arrayPtr)[i] * 2;
}
free(*arrayPtr); // free the *arrayPtr, [which is `arrayPtr` from `main`]
*arrayPtr = tempArrayPtr; //copy tempArrayPtr and put it into *arrayPtr
return;
}
int main(int argc, char **argv) {
int i;
int arrayLength = 2;
int *arrayPtr;
arrayPtr = malloc(sizeof(int) * arrayLength); // do not cast
for (i = 0; i < arrayLength; ++i) {
arrayPtr[i] = i + 500;
}
replaceArray(&arrayPtr, arrayLength);
exit(EXIT_SUCCESS);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句