我制作了一个小程序,我有一个结构,并根据控制台的值填充其参数。
#define M 3
struct data {
char* info;
int key;
};
void initHash(data* d) {
int i;
for(i=0; i<M; i++) {
d[i].info = " ";
d[i].key = -1;
}
}
void printList(data* d) {
int i;
for(i=0; i< M; i++) {
if(strcmp(d[i].info, " ")) {
printf(" %d %d %s \n", i, d[i].key, d[i].info);
}
}
}
int linearProbing() {
struct data d[M];
int hashval;
char* info;
char str[25];
initHash(d);
scanf("%s",&str);
while(strcmp(str, "end") != 0) {
d[id].info = str;
**printf("before reading \n");
printList(d);
id++;
scanf("%s",&str);
printf("after reading \n");
printList(d);
printf("next iter \n");**
}
printList(d);
return true;
}
我的问题是突出显示的行,第一个打印函数打印正确的值,但在获得输入后,data.info参数更改为struct array的所有M成员的新输入值。有人可以解释为什么会这样吗?
示例输出:
statue
before reading
0 -1 statue
tornado
after reading
0 -1 tornado
next iter
before reading
0 -1 tornado
1 -1 tornado
clown
after reading
0 -1 clown
1 -1 clown
next iter
before reading
0 -1 clown
1 -1 clown
2 -1 clown
答案 0 :(得分:4)
您没有将输入字符串复制到每个d[id].info
成员 - 您正在设置指向相同字符缓冲区(str
)的指针,您一次又一次地使用和覆盖。
即,d[0].info
,d[1].info
等都指向同一个记忆。
您可能想说:
d[id].info = strdup(str);
每次指向字符串的新副本。
答案 1 :(得分:2)
您正在将info
变量指向字符串文字。为了存储字符串,您应该首先分配足够的存储空间,如:
info = (char *) malloc(
string size
* sizeof(char))
然后使用string size