2016-12-09 11 views
-1

私は元の親関数の配列(浮動小数点数)を変更する関数を持っています。 Wordはtypedefは構造体であるとWord.dataは(動的)float配列であるC - 参照で配列を渡す - 最初の要素セットのみ

void sortFunction(Word**words, int wordCount){ //to sure if two * are correct (pointer to an array..?) 
int i = 0; 
for(i=0;i<wordCount-1;i++){ 
    Word first = *words[i]; //values fine 
    Word second = *words[i+1]; //weird values, causes segfault 
    if(first.data[0] > second.data[0]){ 
     //do stuff 
    } 
    } 
} 

int main(int argc, char ** argv){ 
    Word* words = NULL; 
    int wordsCount = ... 
    //filling the array in a loop and using realloc for memory allocation 
    //Here, the array is filled correctly (verified) 
    sortFunction(&words, wordsCount); 
} 

:私は、次のコードを使用しています。親関数をチェックインすると、配列が割り当てられ、値が正しく設定されます。

私は配列内の約10個の要素で試しましたが、最初の要素([0])のみがsortFunction()で正常で、2番目の要素がすべて乱されています。構造体にintのプロパティもあります.2番目の要素を印刷しようとすると、10億を超える何かが得られます。

私は配列を正しく渡していないと仮定します。私は次のコード(サンプルのみ)を使用して通常の変数を渡すため、配列に対しては修正しようとしましたが、明らかに正しくありません。配列に対してこれを行う正しい方法は何ですか?

void foo(int*var){ 
    *var=8; 
} 

int main(){ 
    int var = 5; 
    changeVar(&var); 
} 

ご協力いただきありがとうございます!

+3

読み取り[この演算子の優先順位表](http://en.cppreference.com/w/c/language/operator_precedence)とその問題は明らかです。 –

+0

@Someprogrammerdude悲しいことではない:/私は(私が前に思ったように) 'Word ** words'の部分と関係があると思いますか? –

+1

いいえ、その部分ではなく、 '* words [i]'部分です。コンパイラは '*(words [i])'と誤った扱いをします。 –

答えて

3

Postfixの[]は単項*よりも高い優先順位を持っているので、*words[i]はあなたが望むものではありませんこれは、*(words[i])として解析されます。

明示的にグループ括弧を使用してwords*オペレータする必要があるので、あなたは、添字を適用する前wordsポインタ間接参照する必要があります。

Word first = (*words)[i]; 
Word second = (*words)[i + 1]; 
1

まず、あなただけの、**を渡す必要はありませんとにかくあなたの配列のアドレスを渡すことになります:

void sortFunction(Word* words, int wordCount) 

と呼びます:

sortFunction(words, wordsCount); 

第二に、未定義の動作は、次のステートメントに由来する:

Word first = *words[i]; Word second = *words[i+1];

それは(*words)[i]されている必要がありますが、それでも、あなたは構造体をコピーしているので、あなたのダイナミックdata配列が正しくコピーされません。この無用のコピーを回避し、sortFunctionのprotoypeを変更した後、代わりにこれを使用する:

Word* first = &words[i]; 
Word* second = &words[i+1]; 
if(first->data[0] > second->data[0]) 

p.s:これはあなたがコードで示した部分のちょうどコメント、あなたのコードの残りの部分が正しいことを保証するものではありません。

関連する問題