在main()
函数中,我初始化了几个变量(int
和int*
数组)。然后我打印出来并从控制台scanf
中读取它们。
我想将此功能放入某个外部函数中,以便main将如下所示:
int main()
{
int n = 0, x = 0;
int *arr = NULL;
load(&n, &x, &arr);
}
在load()
函数调用之后,我希望变量与load()
函数内部的变量完全一样。我怎么能这样做?
第二个问题,出于好奇:
/**
* Description of the function
*
* @param int n Foo
* @param int x Bar
* @param int *arr Does something
*/
void load(int n, int x, int *arr)
{
// something
}
这个文档在C编码中是否有用,这是一个好习惯吗?
答案 0 :(得分:0)
你传递的是两个int和一个指针(第三个参数)的地址,你应该在指针(一个*
)中接收前两个参数到int和指向指针的第三个参数(两个**
)int:
void load(int* n, int* x, int **arr){
// ^ ^ one* ^ two **
*n = 10;
*x = 9;
}
在加载函数中,您可以为*n
和*x
分配值,因为两者都指向有效的内存地址,但无法执行**arr = 10
只是因为{ {1}}不指向任何内存(指向NULL ),因此首先必须先为arr
分配内存,如下所示:
*arr
此文档在C编码中是否有用,这是一个好习惯吗?
是
但有时我会按照以下方式记录我的函数参数:
void load(int* n, int* x, int **arr){
*n = 10;
*x = 9;
*arr = malloc(sizeof(int));
**arr = 10;
}
修改当您评论时,请执行以下我写的内容,因为void load(int n, // is a Foo
int x, // is a Bar
int **arr){ // do some thing
// something
}
,它不会给出任何错误。
malloc()
编译并运行如下:
#include<stdio.h>
#include<stdlib.h>
void load(int* n, int* x, int **arr){
*n = 10;
*x = 9;
*arr = malloc(sizeof(int));
**arr = 10;
printf("\n Enter Three numbers: ");
scanf("%d%d%d",n,x,*arr);
}
int main(){
int n = 0, x = 0;
int *arr = NULL;
load(&n, &x, &arr);
printf("%d %d %d\n", n, x, *arr);
free(arr);
return EXIT_SUCCESS;
}
由OP评论:
当我将其更改为 arr = malloc(sizeof(int)(* n))时,“从void *到int *的转换无效”;
~$ gcc ss.c -Wall
:~$ ./a.out
Enter Three numbers: 12 13 -3
12 13 -3
malloc()返回void *malloc(size_t size);
和void*
类型为*arr
,这是编译器消息的原因,因为类型不同:int*
但我在malloc()时避免强制转换,因为:Do I cast the result of malloc?(读取Unwind的回答)