需要帮忙。我有以下代码。

    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
...

最佳答案

这里的第一行基本上是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很可能在下一次时被覆盖。
你需要这个:
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]);
}

关于c - 指向相同位置的C数组元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43778979/

10-11 23:03