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.
这两个项目有什么区别?
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)