Запись в массив указателей в C - PullRequest
0 голосов
/ 06 июня 2018

Мне нужно написать адрес указателя структуры (структура называется "Post"), которая разместила другую публикацию.Существует фиксированный тип возврата с именем result со следующим объявлением:

struct result {
   void** elements;
   size_t n_elements;
};

Для структуры Post у нее есть следующее объявление:

struct post {
   uint64_t pst_id;
   uint64_t timestamp;
   size_t* reposted_idxs;
   size_t n_reposted;
};

Вот мой код:

result* find_all_reposts(post* posts, size_t count, uint64_t post_id, query_helper* helper) {

result * ret_result = (result *) malloc(sizeof(result));
ret_result->elements[100];
ret_result->n_elements = 0;

for(int i = 0; i < count; i++){

    post * temp = &posts[i];

    size_t total_reposted = temp->n_reposted;

    if(total_reposted > 0){

        for(int q = 0; q < total_reposted; q++){

            int index_of_repost = temp->reposted_idxs[q];
            ret_result->elements[q] = &posts[index_of_repost];
            ret_result->n_elements++;
        }   
    }
}

return ret_result;
}

Однако я получаю ошибку SEGV для ret_result->elements[q] = &posts[index_of_repost];.Я думал, что это может быть изначально, что я не инициализировал поле элементов в структуре ret_result, но я получаю warning: statement with no effect для этого:

warning: statement with no effect [-Wunused-value]- ret_result->elements[100];

Я думаю, что тип void ** дляполе elements в result может меня смущать.Из того, что я понимаю, это указатель на указатель, который, очевидно, может быть массивом и, следовательно, в основном указателем на массив сообщений?

Я должен уточнить, что count - это количество сообщений и что возвращаемый-Результат управляется отдельно и, следовательно, любая выделенная куча память освобождается в отдельном процессе.

Спасибо за вашу помощь:)

1 Ответ

0 голосов
/ 06 июня 2018

Вы ничего не инициализировали ret_result->elements.Утверждение ret_result->elements[100] является недопустимым, единственная причина, по которой вы тоже не используете segfaulting, заключается в том, что ваш компилятор исключает его.Если вы хотите, чтобы это поле было указателем на массив размером 100, вы должны инициализировать его с помощью malloc.Я не уверен, почему вы объявляете его двойным указателем void **, но если это так, то может сработать что-то подобное:

ret_result->elements = malloc(100 * sizeof(struct post *));

Аргументы вызова также могут быть100 * sizeof(void *), но может быть мало того, что вы намереваетесь хранить там, если вы укажете структуру, на которую будут указывать данные.

...