将指针传递给C中的函数的问题

时间:2011-04-26 12:36:26

标签: c pointers

这是令人烦恼的事情之一,你知道答案很简单,但你却看不到它。

printf中的AllocIntArray语句显示正确为arrayPtr分配了内存位置,但是当运行main中的printf语句时,它显示{{1}仍然设置为arrayB

在将NULL传递给arrayB时,有人可以告诉我我做错了吗?

AllocIntArray

5 个答案:

答案 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)*/