C - 通过引用传递数组 - 仅第一个元素集

时间:2016-12-09 14:47:47

标签: c++ c arrays

我有一个函数应该修改原始父函数中的数组(浮点数)。我使用以下代码:

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);
}

其中Word是typedef结构,Word.data是(动态)float数组。签入父函数时,将分配数组并正确设置值。

我已经尝试过在数组中使用大约10个元素,但总是只有第一个([0])元素在sortFunction()中很好,其次是所有其他元素都搞砸了。我在结构中也有一个int属性,当我尝试为第二个元素打印它时,我得到了超过10亿的东西。

我假设我没有正确传递数组 - 我使用下面的代码(只是一个示例)传递常规变量,所以我尝试修改它为一个数组,但显然,不正确。为数组执行此操作的正确方法是什么?

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

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

提前感谢任何提示!

2 个答案:

答案 0 :(得分:3)

Postfix []的优先级高于一元*,因此*words[i]被解析为*(words[i]),这不是您想要的。

您需要在应用下标之前取消引用words指针,因此您需要使用括号将*运算符与words显式分组:

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

答案 1 :(得分:1)

首先,您不需要传递**,只需要一个就足够了,因为无论如何您将传递数组的地址:

void sortFunction(Word* words, int wordCount)

并将其命名为:

sortFunction(words, wordsCount);

其次,未定义的行为源自以下语句:

  

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

应该是(*words)[i]但是,您仍在复制结构,因此无法正确复制动态 data数组。避免这个无用的副本,并在改变sortFunction的原型之后使用它:

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

p.s:这并不保证您的其余代码是正确的,只是对您展示的代码部分的评论。