了解动态分配引用传递参数

1 c parameter-passing dynamic-memory-allocation

我正在尝试了解如何通过C语言中的引用传递参数.所以我写了这段代码来测试参数传递的行为:

#include <stdio.h>
#include <stdlib.h>

void alocar(int* n){
   n = (int*) malloc( sizeof(int));
   if( n == NULL )
      exit(-1);
   *n = 12;
   printf("%d.\n", *n);
}
int main()
{
   int* n;
   alocar( n );
   printf("%d.\n", *n);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这里印有:

12.
0.

例2:

#include <stdio.h>
#include <stdlib.h>

void alocar(int* n){
   *n = 12;
   printf("%d.\n", *n);
}

int main()
{
   int* n;
   n = (int*) malloc(sizeof(int));
   if( n == NULL )
      exit(-1);
   alocar( n );
   printf("%d.\n", *n);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

它打印:

12.
12.

这两个项目有什么区别?

nos*_*nos 6

C是按值传递,它不提供传递引用.在你的情况下,指针(不是它指向的)被复制到函数paramer(指针通过值传递 - 指针的值是一个地址)

void alocar(int* n){
   //n is just a local variable here.
   n = (int*) malloc( sizeof(int));
  //assigning to n just assigns to the local
  //n variable, the caller is not affected.
Run Code Online (Sandbox Code Playgroud)

你想要的东西是这样的:

int *alocar(void){
   int *n = malloc( sizeof(int));
   if( n == NULL )
      exit(-1);
   *n = 12;
   printf("%d.\n", *n);
   return n;
}
int main()
{
   int* n;
   n = alocar();
   printf("%d.\n", *n);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

要么:

void alocar(int** n){
   *n =  malloc( sizeof(int));
   if( *n == NULL )
      exit(-1);
   **n = 12;
   printf("%d.\n", **n);
}
int main()
{
   int* n;
   alocar( &n );
   printf("%d.\n", *n);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)