这是令人烦恼的事情之一,你知道答案很简单,但你却看不到它。
printf
中的AllocIntArray
语句显示正确为arrayPtr
分配了内存位置,但是当运行main中的printf
语句时,它显示{{1}仍然设置为arrayB
。
在将NULL
传递给arrayB
时,有人可以告诉我我做错了吗?
AllocIntArray
答案 0 :(得分:4)
传递双指针。
#include <stdio.h>
#include <stdlib.h>
void AllocIntArray(int **arrayPtr, int numElements);
int main()
{
int *arrayB = NULL;
AllocIntArray(&arrayB, 10);
printf("Pointer: %p\n", arrayB);
free(arrayB);
getchar();
return EXIT_SUCCESS;
}
void AllocIntArray(int **arrayPtr, int numElements)
{
*arrayPtr = malloc(sizeof(int) * numElements);
printf("Pointer: %p\n", *arrayPtr);
if(*arrayPtr == NULL)
{
fprintf(stderr, "\nError allocating memory using malloc");
exit(EXIT_FAILURE);
}
}
答案 1 :(得分:2)
这是因为arrayB
按值传递给AllocIntArray
。要么通过引用传递它(使用指针到指针),要么更好,从AllocIntArray
返回它:
int *AllocIntArray(int numElements)
{
int *arrayPtr = malloc(sizeof(int) * numElements);
printf("Pointer: %p\n", arrayPtr);
if(arrayPtr == NULL)
{
fprintf(stderr, "\nError allocating memory using malloc");
exit(EXIT_FAILURE);
}
return arrayPtr;
}
答案 2 :(得分:0)
arrayPtr
是一个指针,指针由 value 传递给参数。 AllocIntArray
可以修改其arrayPtr
版本,但main()
不会看到更改。
(编辑:如果您使用的是C ++)修改AllocIntArray
的签名以将arrayPtr
的类型更改为引用应该可以解决您的问题。
void AllocIntArray(int *&arrayPtr, int numElements)
答案 3 :(得分:0)
你需要刷新参数传递给函数。
您要发送给AllocIntArray的指针正被复制到arrayPtr,该行
arrayPtr = (int *)malloc(sizeof(int) * numElements);
为副本分配值,而不是原始变量,因此原始变量仍指向无处。
首先想到的解决方案是发送一个指向该指针的指针,但我认为你最好在参数传递问题上进行一些普遍的研究,然后再进一步了解。
答案 4 :(得分:0)
这里的基本问题是您将arrayB
传递给AllocIntArray
函数,并按值传递。在AllocIntArray
中正确分配内存且arrayptr
有效,但在{{ 1}}它的功能与你期望的内存不同。
这是基本的C编程概念,您可以在函数中检查添加打印。
EX:我在下面的例子中分享问题和成功案例之间的区别。
main
通过引用传递并使用双指针的代码。
/*Code with passed by value as a parameter*/
#include<stdio.h>
#include<stdlib.h>
void AllocateIntarray(int *arrayptr,int numElements)
{
arrayptr = (int*) malloc(sizeof(int)*numElements);
printf("Inside _func_AllocateIntarray_pointer:%p\n",arrayptr);
if(arrayptr == NULL)
{
printf("ERR_MEM_ALLOCATION_FAILED:\n");
}
}
int main()
{
int *arrayB = NULL;
AllocateIntarray(arrayB,10);
printf("Inside _func_mainPointer:%p\n",arrayB);
free(arrayB);
return 0;
}
/*Output :
Inside _func_AllocateIntarray_pointer:0x55be51f96260
Inside _func_mainPointer:(nil)*/