在c中读取字符串时内存覆盖

时间:2017-01-24 17:53:50

标签: c string memory input overwrite

我正在处理的代码需要一个双向量作为输入,我试图通过使用我在git上找到的this small library来使其变量大小。使用字符串而不是双精度的第一次迭代是:

printf("Write vector components (type 'stop' to stop): \n");
int stop = 0;
while (!stop)
{
    fgets(c, sizeof(c), stdin);
    if (strcmp("stop\n",c)!=0)
    {
        vector_add(&v, c);
    } else {
        stop = 1;
    }
}

然而,当我打印结果时(例如有3个输入和“停止”)我得到了

the vector is: stop stop stop

我每次输入一个新组件时都尝试编写第一个组件,结果是最后一个组件覆盖了第一个组件(并且通过扩展,给定最终结果,每个组件)。

但是,如果我手动使用vector_add,则不会发生这种情况。例如,我尝试将git和我自己的代码中的示例结合起来,完整的输出是:

emil hannes lydia olle erik stop stop stop stop

所以它只在阅读时覆盖。我甚至无法理解正在发生的事情。没有在2年内写过任何一篇C,我又重新开始了。

完整代码(不包括矢量库):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "vector.c"

void main(int argc, char* argv[]) {
    char        c[20];
    vector      v; vector_init(&v);


    printf("Write vector components (type 'stop' to stop):\n");
    int stop = 0;
    while (!stop)
    {
        fgets(c, sizeof(c), stdin);
        if (strcmp("stop\n",c)!=0)
        {
            vector_add(&v, c);
            // printf("%s\n", (char*)vector_get(&v, 0));
        } else {
            stop = 1;
        }
    }


    printf("The vector is:\n");
    for (int i = 0; i < vector_count(&v); i++) {
        printf("%s\n", (char*)vector_get(&v, i));
    }

} /* main */

1 个答案:

答案 0 :(得分:2)

vector_add不会复制数据,因此您的字符串仍存储在变量c中。当您读取新字符串时,它会覆盖旧字符串。

如果你的字符串库包含strdup,你可以试试这个:

vector_add(&v, strdup(c));