2

関数ではmain()、いくつかの変数 (intおよびint*配列) を初期化します。次に、何かを印刷してコンソールから読み取りますscanf

この機能を外部関数に配置して、メインが次のようになるようにします。

int main()
{
    int n = 0, x = 0;
    int *arr = NULL;    
    load(&n, &x, &arr);
}

load()関数呼び出しの後、変数がload()関数内で設定されたとおりになるようにします。これどうやってするの?

2 つ目の質問は、好奇心からです。

/**
 * 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 コーディングに役立ちますか?それは良い習慣ですか?

4

1 に答える 1

0

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 = 10arr*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() の場合はキャストを避けています。アンワインドの答えを読んでください

于 2013-04-06T12:48:16.063 に答える