Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用包装函数调用Malloc_C_Arrays_Memory_Malloc - Fatal编程技术网

使用包装函数调用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(

我在一个初级班帮助教C。我们讨论了malloc在动态内存分配中的使用,一个学生想在malloc周围放置一个包装器。我不确定这是否有用,但玩东西是最好的学习方式

然而,当学生试图通过malloc包装函数为数组分配内存时,它没有起作用——分段错误

下面给出了一个最起码的例子

#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“风格”保持一致。很好的解释。我知道这是一件奇怪的非标准的事情。正如前面提到的,那只是一个学生在胡闹;但我经常会遇到充满存根和包装的专业代码,我依靠您利用您的位置从源头上消除这个问题;-)