我需要写一个结构(结构称为"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;
}
但是,我收到ret_result->elements[q] = &posts[index_of_repost];
的SEGV错误。我认为最初可能是我没有初始化ret_result
结构中的元素字段,但我收到了warning: statement with no effect
:
warning: statement with no effect [-Wunused-value]- ret_result->elements[100];
我在想result
elements
领域的void **
类型可能会把我弄乱。据我了解,这是一个指向指针的指针,该指针显然可以是一个数组,因此基本上是指向帖子数组的指针?
我应该澄清一下,count
是帖子的数量,返回的结果是单独管理的,因此任何堆分配的内存都在单独的进程中释放。
感谢您的帮助:)
您尚未初始化ret_result->elements
任何内容。语句ret_result->elements[100]
是无操作的,您没有在那里进行分段错误的唯一原因是因为您的编译器正在将其删除。如果您希望该字段成为指向大小为 100 的数组的指针,则必须使用 malloc 对其进行初始化。我不确定你为什么在这里宣布它是一个void **
双指针,但如果它必须是这样,那么这样的事情可能会起作用:
ret_result->elements = malloc(100 * sizeof(struct post *));
调用的参数也可以是100 * sizeof(void *)
的,但是如果您指定数据将指向的结构,则可能有点您打算存储在那里。