我发现将字符串扫描到缓冲区时,我的结构数组将被覆盖,我可能以某种方式共享相同的内存,但是我不知道如何解决它。
结构体和数组的全局声明
struct Node {
int number;
char *string;
};
struct Node nodes[50] = {{ 0 }};
...对数组中的节点进行的某些操作...
插入功能
void insert(char *string, int number)
{
nodes[lastIndex].number = number;
nodes[lastIndex].string = string;
现在我将字符串扫描到buff
char buff[20]
while (scanf("%s", buff) > 0)
{
if (!strcmp(buff, "print"))
printf("%s", printhighest());
else
{
scanf("%s %d", buff, &number);
insert(buff, number)
}
}
每当第一个条件适用时,结构数组中的char *字符串就会在数组的每个元素上被字符串“ print”覆盖。
在scanf("%s", buff)
所以当我要打印时,它看起来像这样:
节点[0]
-数(10)
-字符串(“打印”)
节点[1]-数字(25)-字符串(“打印”)
等等...
顺便说一句,我无法更改while循环。
感谢帮助。
答案 0 :(得分:1)
问题是这一行:
nodes[lastIndex].string = string;
请注意,char*
本身并不是字符串,实际上只是指向内存中某个字符数组的指针。
使用上面的分配,所有节点都指向完全相同的存储位置buff
,因此所有节点都看到完全相同的文本写入-最终要打印时将获得“打印”:
buff <----------------
| | |
nodes[0].string | |
nodes[1].string |
nodes[2].string
.
.
.
要解决此问题,您需要为字符串创建新的内存,并将buff
的内容复制到;使用How to use #if to decide which platform is being compiled for函数最容易做到:
nodes[lastIndex] = strdup(buff);
或者,复制已经在外部的字符串:
insert(strdup(buff), number);
请注意,strdup
会分配新的内存,因此,当不再需要以防止内存泄漏时,请不要忘记再次释放字符串。