Realloc 结构数组作为函数参数产生分段错误?

Realloc struct array as a function parameter yields segmentation fault?

在询问之前我已经搜索了很多,但我似乎无法使这个功能起作用。
我有这个 array of structs 和 2 个字符串 (char*) 和添加新结构的函数 put()
除非在这种情况下键已经存在,否则它只是用新的值覆盖当前值。

尽管我通过 reference 传递数组并且 没有在函数中制作本地副本,但内存仍然损坏 (Segmentation Fault).

源代码是在 Ubuntu 15.10 下编译的 gcc 的最新版本。
在此先感谢您的帮助!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 3

struct store{
    char *key;
    char *value;
};

void put(char *key, char *value, struct store **store, int size){
    int i, found;
    struct store *temp = realloc(*store, (size + 1) * sizeof(struct store));
    for(i = 0; i < size; ++i){
        if(strcmp(key, store[i]->key) == 0){ //Key found, overwrite new value.
            store[i]->value = strdup(value); //Assume that every value is null terminated
            found = 1;
            break;
        }
    }
    if(found) return;

    *store = temp;
    if(!store){ 
         perror("realloc failed");
         exit(EXIT_FAILURE);
    }    
    store[size]->key = strdup(key); //New element
    store[size]->value = strdup(value);
    return;
}

int main(){
    int i = 0;
    struct store *store = malloc(N * sizeof(struct store));
    if(!store){ 
       perror("malloc failed");
       exit(EXIT_FAILURE);
    }
    store[0].key = strdup("123a");
    store[1].key = strdup("456b");
    store[2].key = strdup("789c");
    store[0].value = strdup("John");
    store[1].value = strdup("Sam");
    store[2].value = strdup("Mary");

    for(i = 0; i < N; ++i)
        printf("%s, %s\n\n",store[i].key,store[i].value); //This works fine

    put("123a","Jim",&store,N);
    for(i = 0; i < N; ++i)
        printf("%s, %s\n\n",store[i].key,store[i].value);

    put("653a","Tom",&store,N);
    for(i = 0; i < N+1; ++i)
        printf("%s, %s\n\n",store[i].key,store[i].value);

    return 0;
}
struct store *temp = realloc(*store, (size + 1) * sizeof(struct store));
for(i = 0; i < size; ++i){
    if(strcmp(key, store[i]->key) == 0){ //Key found, overwrite new value.
        store[i]->value = strdup(value); //Assume that every value is null terminated
        found = 1;
        break;
    }
}
if(found) return;

*store = temp;

如果找到密钥,则不要将 temp 分配给 *storerealloc 可以将分配的内存移动到一个全新的地址,从而留下 *store 悬空指针。而且您确实还应该检查 temp 是否也不为空。

还有你误用store的问题。 store 是您传递给函数的指针的地址,而不是数组的第一个元素。

您需要像这样索引数组 (*store)[i]