使用包装函数调用Malloc
我在一个初级班帮助教C。我们讨论了malloc在动态内存分配中的使用,一个学生想在malloc周围放置一个包装器。我不确定这是否有用,但玩东西是最好的学习方式 然而,当学生试图通过malloc包装函数为数组分配内存时,它没有起作用——分段错误 下面给出了一个最起码的例子使用包装函数调用Malloc,c,arrays,memory,malloc,C,Arrays,Memory,Malloc,我在一个初级班帮助教C。我们讨论了malloc在动态内存分配中的使用,一个学生想在malloc周围放置一个包装器。我不确定这是否有用,但玩东西是最好的学习方式 然而,当学生试图通过malloc包装函数为数组分配内存时,它没有起作用——分段错误 下面给出了一个最起码的例子 #include <stdlib.h> void mallocWrapper(int *intArray, int length){ intArray = malloc(length * sizeof(
#include <stdlib.h>
void mallocWrapper(int *intArray, int length){
intArray = malloc(length * sizeof(int));
}
int main() {
int *array;
int arraySize = 10;
mallocWrapper(array, arraySize);
// this line causes the Segmentation fault
array[0] = 0;
return 0;
}
#包括
void mallocWrapper(int*intArray,int-length){
intArray=malloc(长度*sizeof(int));
}
int main(){
int*数组;
int-arraySize=10;
mallocWrapper(数组,arraySize);
//该行导致分段错误
数组[0]=0;
返回0;
}
据我所知,数组变量将成为内存中为数组保留的第一个点的地址。我假设无论内存分配在哪里,也就是在main或mallocWrapper中,都会出现这种情况
结果,我不知道该告诉学生什么,除了我会告诉他们
任何帮助都将不胜感激。谢谢如果您想更改调用者的
数组
成员,您需要传递指向它的指针。i、 e.您需要将指向指针的指针传递到mallocWrapper
中
void mallocWrapper(int **intArray, int length){
*intArray = malloc(length * sizeof(int));
}
mallocWrapper(&array, arraySize);
或者,更好的方法是,您可以更改mallocWrapper
以返回新分配的内存
void* mallocWrapper(int length){
return malloc(length * sizeof(int));
}
array = mallocWrapper(arraySize);
您正在将指针数组的副本传递给函数,因此函数内部修改的内容不会反映在函数外部。您需要将函数的签名更改为void mallocWrapper(int**intArray,int length)
,并使用*intArray=……
使其工作。使用类似于:
void mallocWrapper(int **intArray, int length)
{
*intArray = malloc(length * sizeof(int));
}
int main()
{
int *array = NULL; //Whenever you declare a pointer assign it to NULL
int arraySize = 10;
mallocWrapper(&array, arraySize);
array[0] = 0;
return 0;
}
在C语言中,函数参数是按值传递的。这有助于程序的稳定性,因为无意中修改函数调用者中的变量不太容易 在您的例子中,
intArray=malloc(length*sizeof(int))
不会更改main()
中指针数组的值,因此在取消引用未初始化指针时(通过几乎功能等效的数组表示法),会出现未定义的行为
将指针传递给指针是一种方法:
void mallocWrapper(int** intArray, int length){...
mallocWrapper(&array, arraySize);
正如修改函数以返回新指针一样
但是,我不鼓励以这种方式删除标准C库函数,因为这会使程序更难阅读和调试:如果我看到对malloc
的调用,那么我就知道会发生什么。如果我看到mallocWrapper
我不知道会发生什么,直到我阅读了文档或函数源代码本身。是的,我只是错过了它。我理解为什么它不起作用,现在我会告诉问这个问题的学生。但也许你一生中从未错过过一个明显的错误。在这种情况下,对您来说,调试一定是一个梦想。第二种方法就是要走的路。包装malloc()
和更改调用“样式”似乎非常不友好。当然-我应该发现。。。我的思维定势是指针通过引用传递,然后忘记了,我想更改实际的指针地址,而不是地址中的内容。谢谢你的回复。我同意第二种方法是最好的,因为它与其他帖子中提到的malloc“风格”保持一致。很好的解释。我知道这是一件奇怪的非标准的事情。正如前面提到的,那只是一个学生在胡闹;但我经常会遇到充满存根和包装的专业代码,我依靠您利用您的位置从源头上消除这个问题;-)