2016-10-17 11 views
-2

Cの関数に配列のポインターを渡したいが、セグメンテーションフォルトが発生し続ける。ローカルスコープ内の構造体セグメンテーションフォールトの配列へのポインター(C)

ので、要点は私が持っている構造...

です:メインファイルで

typedef struct A { 
    int cost; 
} B 

を:

static B (*arr_p)[] = NULL; 
static B arr[30]; 

void foo(B **item) 
{ 
    printf("cost %d\n",(*item)[0].cost); // seg fault 11 :(
} 

int main(int argc, char **argv) 
{ 
    arr_p = &arr; 
    (*arr_p)[0].cost = -1; 
    printf("Cost %d\n", (*arr_p)[0].cost); // works 
    foo((B **) arr_p); 
} 

この厄介なワンセグ障害に対処する方法はあります?

答えて

2

配列へのポインタをfooに渡しています。配列へのポインタを受け入れるには、fooの定義を変更する必要があります。

変更

void foo(B **item) 
{ 
    printf("cost %d\n",(*item)[0].cost); // seg fault 11 :(
} 

void foo(B (*item)[]) 
{ 
    printf("cost %d\n",(*item)[0].cost); // seg fault 11 :(
} 

に問題はあなたがそのライン上の警告を取得せずにキャストため foo((B **) arr_p);キャストでマスキングしました。このような警告を型キャストすることは、一般的には良い考えではありません。この場合、セグメント化エラーが発生します。それは、単純な、あなたはポインタと関数定義の両方に同じ宣言構文を使用することができるようにするに

0

struct B { 
    int cost; 
}; 

static struct B array[30]; 

static struct B (*arr_p)[] = NULL; 

/* Note the similarity in syntax: */ 
void f(struct B (*array)[], 
/* ..and keep the array size to avoid common mistakes: */ 
     size_t array_size) { 
    printf("%d\n", (*array)[1].cost); 
} 

int main (int argc, char **argv) 
{ 
    arr_p = &array; 

    f(arr_p, sizeof array/sizeof *array); 

    return EXIT_SUCCESS; 
} 
関連する問題