Разыменование двойного указателя, входящего в функцию, а затем передаваемого другому - PullRequest
0 голосов
/ 30 января 2020

У меня проблемы с выполнением следующего сценария. У меня есть функция, которая выглядит так:

void testing(mystruct str**) {
    pthread threads[5];
    for(int i = 0; i < 5; i++) {
        pthread_create(&thread[i], NULL, process, (void)&(*str));   //not really sure how to pass this here
    }
}

void * process(void *arg) {
    struct mystruct **value = arg;   //probably wrong but it compiles, then blows up some where else because its not really the value that was original passed.
}

Я новичок в C и, насколько я понимаю, это то, что он делает,

  • Я получаю двойной указатель
  • чтобы передать его функции, я бы передал его как приведенный как void, потому что это то, что принимает функция, а также с адресом указателя str (или это будет адрес указателя на указатель? & str?) * затем, получив его на другой стороне, я установил его, попытался привести его к структуре, но это тоже не go хорошо как таковое:

    struct mystruct **value = *(mystruct *)arg;

но я получаю "разыменование указателя на неполный тип"

любая помощь, понимающая это, будет очень признательна.

1 Ответ

2 голосов
/ 30 января 2020

Вы должны иметь возможность передавать указатель как есть, поскольку каждый тип указателя объекта в C может быть неявно преобразован в / из void*. Тем не менее, правильнее отменить ссылку на указатель на один уровень. То есть:

pthread_create(&thread[i], NULL, process, *str);

ВАЖНО: Предполагается, что str указывает на переменную, которая будет не go вне области видимости во время выполнения потока! Передача указателей на локальные переменные потокам является распространенным источником ошибок.

С этого момента ваш обратный вызов потока должен сделать что-то вроде этого:

void * process(void *arg) {
    struct mystruct* ms = arg; 
    struct mystruct** ptr_ms = &arg; 

Однако указатель разыменования ошибки "error" к неполному типу "просто означает, что определение структуры невидимо для потока, в результате чего тип структуры будет рассматриваться как неполный. Так что проблема может быть также в пропущенном #include.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...