Realloc struct array作为函数参数产生分段错误?

时间:2017-03-17 23:44:45

标签: c arrays struct realloc

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

尽管我通过引用传递数组并且没有在函数中创建本地副本,但内存仍然已损坏(Segmentation Fault)

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

#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;
}

1 个答案:

答案 0 :(得分:2)

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]索引数组。