【问题标题】:Realloc - Realloc do not make smaller char*Realloc - Realloc 不会使字符变小*
【发布时间】: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 开始)。

标签: c string size realloc


【解决方案1】:

您混淆了“大小”的两个不同概念。这是一个包含 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实际上并不会改变字符串中的任何字节,它只是释放附近的一些内存。

【讨论】:

  • 也许是个吹毛求疵:可能不是 编译器 不知道它是否已经通过了数组。
  • 同意,@ThomasPadron-McCarthy,改为“软件”。
猜你喜欢
  • 2014-04-09
  • 2012-10-01
  • 2012-11-30
  • 2020-04-08
  • 2016-10-25
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
相关资源
最近更新 更多