代码之家  ›  专栏  ›  技术社区  ›  Hews

在C中写入指针数组

  •  0
  • Hews  · 技术社区  · 6 年前

    我需要写一个结构(结构称为“post”)的指针地址,它已经重新发布了另一个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 字段在 结果 可能是在耍我。据我所知,这是指向一个指针的指针,它显然可以是一个数组,因此基本上是指向一个posts数组的指针?

    我应该澄清一下 count 是投递数,返回的结果是单独管理的,因此任何堆分配的内存都会在单独的进程中释放。

    谢谢你的帮助:)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Roflcopter4    6 年前

    你还没有初始化 ret_result->elements 任何事。声明 ret_result->elements[100] 是一个不操作,唯一的原因是你不分段也因为你的编译器是削减它。如果希望该字段是指向大小为100的数组的指针,则必须使用malloc对其进行初始化。我不知道你为什么说这是 void ** 这里有双指针,但如果一定是这样的话,这样的方法可能会奏效:

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

    调用的参数也可以是 100 * sizeof(void *) ,但如果指定数据将指向的结构,则可能是要存储在其中的一点内容。