C数组元素poiting到相同的位置

时间:2017-05-04 09:28:01

标签: c pointers malloc

需要一些帮助。我有以下代码。

    char *lines[100];
    int i;

    for (i = 0; i < 100; i++)
    {
        char temp[10];
        _itoa_s(i, temp,10);
        char result[10] = "test";
        strcat_s(result, temp);

        lines[i] = (char*)malloc(sizeof(char));
        lines[i] = result;
    }

    for (i = 0; i < 100; i++)
    {
        cout << lines[i] << endl;
    }

为什么要打印:

test99
test99
test99
...

事实证明char result[10]将指向 相同的记忆位置。为什么?期待这样的事情:

test1
test2
test3
...

2 个答案:

答案 0 :(得分:3)

这里的第一行基本上是NOOP(实际上是在创建内存泄漏,因为你通过在下一行覆盖它来丢弃malloc返回的指针)。

lines[i] = (char*)malloc(sizeof(char));  // this is a basically a NOOP
lines[i] = result;

它或多或少像写作:

foo = 5;
foo = result;

所以你的代码最终会这样:

for (i = 0; i < 100; i++)
{
    char temp[10];
    _itoa_s(i, temp,10);
    char result[10] = "test";
    strcat_s(result, temp);

    lines[i] = result;  // copying just the pointer,
}

因此所有lines[i]都包含指向同一内存位置result的指针。

result的范围也仅限于{}之间的部分,因此一旦for循环终止,result可能会在下一次被覆盖

你需要这个:

char *lines[100];

for (int i = 0; i < 100; i++)
{
    char temp[10];
    _itoa_s(i, temp,10);
    char result[10] = "test";
    strcat_s(result, temp);

    lines[i] = (char*)malloc(sizeof(char) * strlen(result)   + 1);
                                         // ^string length     ^space for NUL terminator

    strcpy(lines[i], result);  // actually copying the the string (not only the pointer)
}

完成后,您还需要释放已分配的内存:

for (i = 0; i < 100; i++)
{
    free(lines[i]);
}

答案 1 :(得分:2)

在您的代码中,由于

 lines[i] = result;

所有指针最终指向同一个result,最后一个指针。

如果您对内容感兴趣,可以使用strcpy()

但等等,还有另外一个问题。你写的是

 lines[i] = (char*)malloc(sizeof(char));

分配1个字节的内存,在这里,什么都不做。在strcpy()中将指针用作目标之前,需要确保指针指向足够的内存,包括终止空值,以保存连接的字符串

建议:魔鬼在细节中。在进行反复试验之前,请仔细研究该语言。