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