gpt4 book ai didi

c - Realloc - Realloc 不会生成更小的 char*

转载 作者:太空宇宙 更新时间:2023-11-04 06:24:59 27 4
gpt4 key购买 nike

  OS: Linux
CC: GCC 4.8.2

目标:改变 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

printf测试函数:

  void printfTest(char * data)
{
printf("Test: '%s'", tmp);
}

结果:

 Test: 'BLABLABL' //8chars
Test: 'BLABLABL' //8chars (!? Why)

我的失败在哪里?

最佳答案

您混淆了“大小”的两个不同概念。这是一个包含 100 个字符的字符数组:

char x[100]; // sizeof(x) / sizeof(x[0]) == 100
strcpy(x, "short string");

x 数组的大小仍然是 100,即使字符串 strlen(x) 的长度仅为 12。

(实际上,也许您可​​以从 C 中对字符串的基本介绍中受益,例如 this tutorial 而不是阅读此答案。)

当您在 C 中打印一个字符串时,软件会一直打印字符,直到它找到 \0(空字符),即使这涉及读取传递结束的阵列。事实上,编译器无法知道它是否经过了数组。它只是盲目地继续,直到找到空字符。

上面的 strcpy 实际上写入了 13 个字节,而不是 12 个。它在末尾打印了 12 个字符空字符。

这意味着 C 中的一个旨在保存字符串的数组实际上必须有一个额外的空间来保存空字符。如果要存储"world",至少要有六个字符

char y[5];
strcpy(y,"hello"); // undefined behaviour, as y is too small
char z[6];
strcpy(z,"hello"); // OK

(不,strncpy 不能解决这个问题。"No null-character is implicitly appended at the end of destination if source is longer than num. ")

无论如何,回到你的问题。缩短字符串的一种方法是在适当的位置写入空字符:

char x[100];
strcpy(x, "hello");
printf("%s\n", x); // prints "hello"
x[3] = '\0'; // replace the second 'l' with the null
printf("%s\n", x); // prints "hel"

要更改字符串,您需要更改字节,可能使用像我这样的代码,或者可能使用另一个 strcpy

简单地调用 realloc 实际上不会改变字符串中的任何字节,它只是释放附近的一些内存。

关于c - Realloc - Realloc 不会生成更小的 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28307383/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com