Очень странное поведение при объявлении массива

#c #arrays

#c #массивы

Вопрос:

У меня есть простая функция:

     DoRead(double *writeArray){
//GblOutData is an array of length 80, where each element is 1
    writeArray=GblOutData;
//prints out 1
    printf("%f",writeArray[5]);
    return 0;
    }
  

что происходит, когда я вызываю DoRead():

 double data[80];    
DoRead(data);
printf("%f",data[5]);
//prints out 0.000000 instead of 1
  

Я не могу понять, почему это происходит. Есть идеи?

Комментарии:

1. Потому что вы никогда не устанавливаете data[5] значение 1? К вашему сведению, вы не меняете параметр вне функции, когда вы это делаете writeArray=GblOutData; , вы просто меняете указатель внутри функции и фактически просто печатаете GblOutData[5] .

2. @SethCarnegie ты прав! сработало, когда я просто вручную установил writeArray [5] = 1

Ответ №1:

Все, что строка

 writeArray=GblOutData;
  

изменяет значение переменной writeArray внутри функции DoRead(). Когда он возвращается, данные внешней переменной не изменились. Вы хотите скопировать содержимое, возможно, с помощью memcpy:

 memcpy(writeArray, writeArray=GblOutData, 80*sizeof *writeArray);
  

Комментарии:

1. Конечно, вам всегда нужно убедиться, что два массива имеют одинаковый размер. Когда эта программа вырастет, это станет проблемой.

Ответ №2:

Вам нужно передать адрес в data. Одним из решений может быть (но лично я бы не стал делать что-то подобное):

 DoRead(double **writeArray){
 *writeArray=GblOutData;
  ....
}

DoRead((double**) amp;data);
  

Комментарии:

1. к сожалению, я не могу свободно изменять способ установки / вызова параметров в DoRead, однако я могу делать все, что захочу внутри функции.

2. Вероятно, не то, что он хотел сделать в этом случае, поскольку он уже выделил массив снаружи.

3. Я бы выбрал решение drdwilcox с memcpy. В любом случае, я только попытался продемонстрировать, что происходит.