C как передать указатель на указатель массива структуры - PullRequest
0 голосов
/ 13 мая 2018

Я понимаю, что это, скорее всего, проблема с синтаксисом, однако у меня есть структура:

struct pixel{
int pixel_num;
double lowest_dist;
int centroid;
double * location;
};

и массив этих структур struct pixel * pixel_data[10] и метод: void foo(double ** arr), и я пытаюсь передать адрес указателя location в экземпляре структуры, чтобы обновить указатель в методе foo.

Я попытался передать его следующим образом: foo(&(pixel_data[0]->location)), однако это явно не правильно, поскольку при запуске через gdb значения *arr отличаются в foo от того, что они были в main(), где я называю foo.

Спасибо.

Пример:

#define DIMENSIONS 5
//Struct is declared in header.
//max 10 pixels
struct pixel * pixel_data[10];

int main(){
    double newLoc[DIMENSIONS]={1.1,2.2,3.3,4.4, 5.5};
    pixel_data[0]=add_pixel(newLoc);
    update_centroid_location(&(pixel_data[0]->location), 0, DIMENSIONS);
}
void update_centroid_location(double **centroid, int centroid_num, int numpix){
    double * old_cent=malloc(DIMENSIONS*sizeof(double));
    if(!old_cent){
    perror("couldnt allocate memory");
    exit(4);
    }   
    for(int i=0;i<DIMENSIONS;i++){
    old_cent[i]=*centroid[i]; //segfaults here as cannot access memory address
    }   
}
struct pixel * add_pixel(double * location){
    struct pixel * new=malloc(sizeof(struct pixel));
    if(!new){
    perror("Could not allocate space for pixel");
    exit(4);
    }   
    new->lowest_dist=DBL_MAX;
    new->centroid=0;
    new->location=location;
    return new;
}

1 Ответ

0 голосов
/ 13 мая 2018

В строке old_cent[i]=*centroid[i]; имеется недоразумение относительно приоритета оператора .
Оператор * имеет более низкий приоритет, чем [].
Так что вы, по сути, делаете old_cent[i]=*(centroid[i]);

Попробуйте использовать круглые скобки, чтобы явно выразить, что вы хотите сначала разыменовать, а затем добавить смещение для второй разыменования следующим образом:

old_cent[i]=(*centroid)[i];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...