需要一些帮助。我有以下代码。
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
...
答案 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()
中将指针用作目标之前,需要确保指针指向足够的内存,包括终止空值,以保存连接的字符串。
建议:魔鬼在细节中。在进行反复试验之前,请仔细研究该语言。