我有一个函数应该修改原始父函数中的数组(浮点数)。我使用以下代码:
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);
}
提前感谢任何提示!
答案 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:这并不保证您的其余代码是正确的,只是对您展示的代码部分的评论。