Realloc-Realloc不生成较小的字符*

Realloc-Realloc不生成较小的字符*,c,string,size,realloc,C,String,Size,Realloc,目标:将char*->的大小更改为更小 问题:更改后的大小相同 行是包含数据的字符串 代码片段: OS: Linux CC: GCC 4.8.2 [……] [……] 现在较小的tmp: tmp = malloc(sizeof(char) * 8); strncpy(tmp, line, sizeof(char) * 8); printfest函数: printfTest(tmp); //Content dump nevAddr = realloc(tmp, sizeof(

目标:将char*->的大小更改为更小

问题:更改后的大小相同

行是包含数据的字符串

代码片段:

  OS: Linux
  CC: GCC 4.8.2
[……]

[……]

现在较小的tmp:

 tmp = malloc(sizeof(char) * 8);

 strncpy(tmp, line, sizeof(char) * 8);
printfest函数:

 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
结果:

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

我的失败在哪里?

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

 Test: 'BLABLABL' //8chars
 Test: 'BLABLABL' //8chars (!? Why)
x
数组的大小仍然是100,即使字符串
strlen(x)
的长度只有12

(实际上,也许你可以从C语言中对字符串的基本介绍中获益,比如不阅读这个答案。)

在C中打印字符串时,软件会一直打印字符,直到找到一个
\0
(空字符),即使这涉及读取数组的末尾。事实上,编译器无法知道它是否已通过数组。它只是盲目地继续,直到找到空字符

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

这意味着C中用于保存字符串的数组实际上必须有一个额外的空间来保存空字符。如果要存储
“世界”
,则必须至少包含六个字符

char x[100]; // sizeof(x) / sizeof(x[0]) == 100
strcpy(x, "short string");
(没有,
strncpy
无法解决此问题。)

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

char y[5];
strcpy(y,"hello"); // undefined behaviour, as y is too small
char z[6];
strcpy(z,"hello"); // OK
要更改字符串,您需要更改字节,可以使用类似我的代码,也可以使用另一个
strcpy


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

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

 Test: 'BLABLABL' //8chars
 Test: 'BLABLABL' //8chars (!? Why)
x
数组的大小仍然是100,即使字符串
strlen(x)
的长度只有12

(实际上,也许你可以从C语言中对字符串的基本介绍中获益,比如不阅读这个答案。)

在C中打印字符串时,软件会一直打印字符,直到找到一个
\0
(空字符),即使这涉及读取数组的末尾。事实上,编译器无法知道它是否已通过数组。它只是盲目地继续,直到找到空字符

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

这意味着C中用于保存字符串的数组实际上必须有一个额外的空间来保存空字符。如果要存储
“世界”
,则必须至少包含六个字符

char x[100]; // sizeof(x) / sizeof(x[0]) == 100
strcpy(x, "short string");
(没有,
strncpy
无法解决此问题。)

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

char y[5];
strcpy(y,"hello"); // undefined behaviour, as y is too small
char z[6];
strcpy(z,"hello"); // OK
要更改字符串,您需要更改字节,可以使用类似我的代码,也可以使用另一个
strcpy


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

sizeof(char)
1
。为什么您希望
realloc
修改您的缓冲区。我需要削减字符串长度为3个字符和传递参考功能。2.释放未使用的内存字符串会发生什么情况?在重新分配期间,移动内存块不需要
realloc
。无论如何,您负责处理数据-null再次终止字符串。您的第二个printf调用未定义的行为,因此一切都是可能的。而不是
\n
。您需要
\0
。如果只有3个字节,则无法访问任何大于2的索引(记住索引从0开始)。
sizeof(char)
1
。为什么您希望
realloc
修改您的缓冲区。我需要削减字符串长度为3个字符和传递参考功能。2.释放未使用的内存字符串会发生什么情况?在重新分配期间,移动内存块不需要
realloc
。无论如何,您负责处理数据-null再次终止字符串。您的第二个printf调用未定义的行为,因此一切都是可能的。而不是
\n
。您需要
\0
。如果你只有3个字节,你就不能访问任何大于2的索引(记住索引从0开始)。也许是吹毛求疵:可能不是编译器不知道它是否通过了数组。同意,@ThomasPadron McCarthy,改为“软件”。可能是吹毛求疵:可能不是编译器不知道它是否已通过数组。同意,@ThomasPadron McCarthy改为“软件”。