需要帮忙。我有以下代码。
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/