3

Cの質問

やあ、

関数にdoubleポインターを渡して、double配列を割り当て、関数内の配列を10.10としましょう。

私は次のことを行いますが、メインの配列にアクセスするとセグメンテーション違反が発生します。

void function(double **array, int size){

    *array = (double*) malloc(size * sizeof(double)); 
    int i;
    for(i=0;i<size;i++){
    *array[i] = 10.10;
    }


}

int main(){

    double *array = NULL;

    function(&array,20);
    printf("array[0] = %lg\n",array[0]);// here is where I get segmentation fault


}

何か助けはありますか?

4

2 に答える 2

3

オペレーターの優先順位に反しました。

変化する:

for(i=0;i<size;i++){
    *array[i] = 10.10;
}

に:

for(i=0;i<size;i++){
    (*array)[i] = 10.10;
}

警告を有効にしてコンパイルした場合(たとえばgcc -Wall ...)、コンパイラがこれをキャッチしていたことに注意してください。常に警告を有効にしコンパイルし、警告に注意を払い、理解し、修正してください。

于 2013-01-18T14:46:23.740 に答える
2
*array[i]

自分が思っていることを意味するわけではありません(C演算子の優先順位テーブルを使用して調べてください)。

判読不能で醜くて紛らわしい(そう、それはあなたを混乱させた)コードの代わりに、一時変数を使用します(そして、神の愛のためにmallocの戻り値をキャストしないでください!):

void function(double **array, int size)
{
    if (array == NULL) return;

    double *tmp = malloc(size * sizeof(*tmp)); 
    if (tmp == NULL) {
        *array = NULL;
        return;
    }

    int i;
    for (i = 0; i < size; i++) {
        tmp[i] = 10.10;
    }

    *array = tmp;
}

また、return 0;からmain()。本当に。

于 2013-01-18T14:50:48.333 に答える