首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Realloc - Realloc不制造较小的char*

Realloc - Realloc不制造较小的char*
EN

Stack Overflow用户
提问于 2015-02-03 19:42:53
回答 1查看 821关注 0票数 0
代码语言:javascript
复制
  OS: Linux
  CC: GCC 4.8.2

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

问题:改变后的尺寸是一样的..。

行是带有数据的字符串..。

代码片段:

代码语言:javascript
复制
 char * tmp = NULL;

..。

代码语言:javascript
复制
 tmp = malloc(sizeof(char) * 8);

 strncpy(tmp, line, sizeof(char) * 8);

..。

现在较小的tmp:

代码语言:javascript
复制
 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函数:

代码语言:javascript
复制
  void printfTest(char * data)
  {
      printf("Test: '%s'", tmp);
  }

结果:

代码语言:javascript
复制
 Test: 'BLABLABL' //8chars
 Test: 'BLABLABL' //8chars (!? Why)

我的失败在哪里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-03 19:53:53

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

代码语言:javascript
复制
char x[100]; // sizeof(x) / sizeof(x[0]) == 100
strcpy(x, "short string");

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

(实际上,也许您可以从C中字符串的基本介绍中获益,比如本教程,而不是阅读这个答案。)

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

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

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

代码语言:javascript
复制
char y[5];
strcpy(y,"hello"); // undefined behaviour, as y is too small
char z[6];
strcpy(z,"hello"); // OK

(不,strncpy没有解决这个问题。“如果源大于num,则在目标末尾隐式追加无空字符。”)

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

代码语言:javascript
复制
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实际上不会改变字符串中的任何字节,它只是释放附近的一些内存。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28307383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档