【发布时间】:2015-04-03 03:34:21
【问题描述】:
OS: Linux
CC: GCC 4.8.2
Targer: 改变 char* 的大小 -> 变小
问题:更改后的大小相同...
行是带有数据的字符串...
代码片段:
char * tmp = NULL;
[...]
tmp = malloc(sizeof(char) * 8);
strncpy(tmp, line, sizeof(char) * 8);
[...]
现在更小的 tmp:
printfTest(tmp); //Content dump
nevAddr = realloc(tmp, sizeof(char) * 3);
if(newAddr != NULL)
{
tmp = newAddr;
}
else
{
free(tmp);
puts("Realloc - FAIL");
exit(VALID);
}
printfTest(tmp); //Content dump
printfTest 函数:
void printfTest(char * data)
{
printf("Test: '%s'", tmp);
}
结果:
Test: 'BLABLABL' //8chars
Test: 'BLABLABL' //8chars (!? Why)
我的失败在哪里?
【问题讨论】:
-
sizeof(char)是1。为什么你期望realloc修改你的缓冲区? -
1.我需要将字符串长度剪成 3 个字符并通过 ref。发挥作用。 2.释放未使用的内存
-
你希望字符串会发生什么?碰巧
realloc不需要在重新分配期间移动内存块。无论如何,您负责处理数据 - 再次以空值终止字符串。 -
你的第二个 printf 调用了未定义的行为,所以一切皆有可能。
-
不是
\n。你需要\0。如果你只有 3 个字节,你就不能访问任何大于 2 的索引(记住索引从 0 开始)。