0

私はCにまったく慣れていないので、関数内の配列を初期化しようとしました。

ただし、mainメソッドで値を出力したい場合は、常にセグメンテーション違反が発生するため、機能しません。

 static void array(int *i)
{
    int j = 0;
    i = (int *) malloc(5 * sizeof (int));
    for (j = 0; j < 5; j++) {
        i[j] = j;
    }

    for (j = 0; j < 5; j++) {
        printf("Hello: %d\n", i[j]);
    }
}

/* Main entry point */
int main(int argc, char *argv[])
{
    int j;
    int *i = NULL;

    array(i);
    for (j = 0; j < 5; j++) {
        printf("Hello: %d\n", i[j]);
    }
    return 0;
}

誰かがコードを修正して、それがどのように機能するかを説明できればいいのにと思います。

4

2 に答える 2

3
static void array(int **i)
{
    int j = 0;
    *i = malloc(5 * sizeof (int));
    for (j = 0; j < 5; j++) {
        (*i)[j] = j;
    }

    for (j = 0; j < 5; j++) {
        printf("Hello: %d\n", (*i)[j]);
    }
}

/* Main entry point */
int main(int argc, char *argv[])
{
    int j;
    int *i = NULL;

    array(&i);
    for (j = 0; j < 5; j++) {
        printf("Hello: %d\n", i[j]);
    }
    return 0;
}

ポインタを値ごとに配列に渡すので、代わりにポインタをポインタに渡してから、それを設定/使用する必要があります。


mallocの結果をキャストすべきでない理由については、「mallocの結果をキャストしますか?」を参照してください。具体的には、mallocの結果をキャストすることの危険性は何ですか

于 2012-10-22T19:14:18.490 に答える
1

関数内から変数にメモリを割り当てるには、関数の引数としてポインタをポインタに渡し、ポインタを逆参照してからメモリを割り当てる必要があります。

または擬似コードで

function(int **i)
{
    *i = malloc...
}
int *i = NULL;
function(&i);

これはそれを行う方法の1つです。また、mallocが返すポインターを返すこともできます。そして、私が読んだ資料から、リターンタイプのmallocをキャストしないことをお勧めします。

于 2012-10-22T19:13:42.273 に答える