2 つの int と 1 つのポインター (3 番目の引数) のアドレスを渡します。最初の 2 つの引数を int へのポインター (one *
) で受け取り、3 番目の引数を int のポインターへのポインター (2 **
) で受け取る必要があります。
void load(int* n, int* x, int **arr){
// ^ ^ one* ^ two **
*n = 10;
*x = 9;
}
ロード関数では、両方が有効なメモリアドレスを指しているため、に値を割り当てることができ*n
ますが、 がメモリを指していない ( NULL を指している) ため、単純に行うことはできません。*x
**arr = 10
arr
*arr
void load(int* n, int* x, int **arr){
*n = 10;
*x = 9;
*arr = malloc(sizeof(int));
**arr = 10;
}
このドキュメンテーションは C コーディングに役立ちますか?それは良い習慣ですか?
はい
しかし、次のように関数の引数を文書化することがあります。
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;
}
次のようにコンパイルして実行します。
~$ gcc ss.c -Wall
:~$ ./a.out
Enter Three numbers: 12 13 -3
12 13 -3
OPのコメントとして:
これをarr = malloc(sizeof(int) (*n));に変更すると、「void* から int* への変換が無効です」と表示されます。
malloc() の構文:
void *malloc(size_t size);
malloc() が返さvoid*
れ、*arr
型がint*
異なるため、コンパイラ メッセージが返される理由は次のとおりです。"Invalid convertion from void* to int*"
しかし、malloc() の場合はキャストを避けています。(アンワインドの答えを読んでください)