C scanf覆盖全局声明的结构数组
我发现在将字符串扫描到缓冲区时,我的结构数组被覆盖,我可能共享相同的内存,但我不知道如何修复它 结构和结构全局声明数组 。。。数组中节点的某些操作 插入函数 现在我把字符串扫描成buff 每次应用第一个条件时,结构数组中的char*字符串就会被数组中每个元素上的字符串“print”覆盖 在C scanf覆盖全局声明的结构数组,c,arrays,memory,buffer,structure,C,Arrays,Memory,Buffer,Structure,我发现在将字符串扫描到缓冲区时,我的结构数组被覆盖,我可能共享相同的内存,但我不知道如何修复它 结构和结构全局声明数组 。。。数组中节点的某些操作 插入函数 现在我把字符串扫描成buff 每次应用第一个条件时,结构数组中的char*字符串就会被数组中每个元素上的字符串“print”覆盖 在scanf(“%s”,buff) 所以当我想要打印时,它看起来像这样: 节点[0] -数字(10) -字符串(“打印”) 节点[1]-编号(25)-字符串(“打印”) 等等 顺便说一句,我不能改变while
scanf(“%s”,buff)
所以当我想要打印时,它看起来像这样:
节点[0]
-数字(10)
-字符串(“打印”)
节点[1]-编号(25)-字符串(“打印”)
等等 顺便说一句,我不能改变while循环 谢谢您的帮助。问题是这行:
nodes[lastIndex].string = string;
请注意,char*
本身不是字符串,实际上只是指向内存中某个字符数组的指针
通过上述分配,所有节点都指向完全相同的内存位置buff
,因此所有节点都看到完全相同的文本,当您最终想要打印时,这些文本将被“打印”:
buff <----------------
| | |
nodes[0].string | |
nodes[1].string |
nodes[2].string
.
.
.
或者,复制已在外部的字符串:
insert(strdup(buff), number);
请注意,
strdup
会分配新内存,因此不要忘记在不再需要时再次释放字符串以防止内存泄漏。不清楚什么是str
,是否为节点[…]分配内存。string
?。。。请在节点数组中的节点中发布一些基本的插入字符串,如果我在控制台中键入“插入字符串”,它将在节点数组中的特定节点中插入此字符串。但当我输入“print”时,它应该打印最新的一个。是的,但是最近一个的char*字符串是“print”,这并不能回答评论中的问题。什么是str
,您是否为节点[x].string分配内存?你应该添加MCVE是有原因的。我编辑了这个问题。我没有分配任何内存。是的,我没有意识到我只分配了一个指针。Strdup()解决了这个问题,谢谢。
nodes[lastIndex].string = string;
buff <----------------
| | |
nodes[0].string | |
nodes[1].string |
nodes[2].string
.
.
.
nodes[lastIndex] = strdup(buff);
insert(strdup(buff), number);