在询问之前我已经搜索了很多,但我似乎无法使这个功能起作用。
我有这个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;
}
答案 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
分配给*store
。 realloc
可以将分配的内存移动到一个全新的地址,从而使*store
成为悬空指针。你还应该检查temp
是否也为空。
还有你滥用store
的问题。 store
是传递给函数的指针的地址,而不是数组的第一个元素。
您需要像这样(*store)[i]
索引数组。