C scanf覆盖全局声明的结构数组

时间:2018-10-18 08:02:49

标签: c arrays memory buffer structure

我发现将字符串扫描到缓冲区时,我的结构数组将被覆盖,我可能以某种方式共享相同的内存,但是我不知道如何解决它。

  

结构体和数组的全局声明

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)

之后while循环开始时,它的变化很快。

所以当我要打印时,它看起来像这样:

节点[0]     -数(10)     -字符串(“打印”)
节点[1]-数字(25)-字符串(“打印”)
等等...

顺便说一句,我无法更改while循环。

感谢帮助。

1 个答案:

答案 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会分配新的内存,因此,当不再需要以防止内存泄漏时,请不要忘记再次释放字符串。