【问题标题】:Do I need to change the size of my char pointer every time I change its content?每次更改内容时是否需要更改 char 指针的大小?
【发布时间】:2014-02-07 21:42:53
【问题描述】:

我将目标的大小定义为 string1 的大小。然后我将 string2 添加到目标。我没有增加目标的大小。为什么我的静止代码有效?

char *string1 = "this is a ";
char *target = malloc(sizeof(string1)); // if i don't do this, code gives error.
strcpy(target, string1);
printf("%s\n", target);

char *string2 = "string";
strcat(target, string2); // how come I don't need to call malloc again?
printf("%s\n", target); // works

我在 Mac 上用 Xcode 编译了这个。

【问题讨论】:

  • 你的代码从头到尾都是错误的。
  • sizeof(string1) 为 4(取决于机器),因为指针存储为整数。
  • 使用char *target = malloc(strlen(string1) + 1);。然后在strcat() 之前使用target = realloc(target, strlen(string1) strlen(string2) + 1);

标签: c pointers char malloc string-concatenation


【解决方案1】:

它之所以有效,是因为你很幸运。写入缓冲区末尾是一种破坏缓冲区后面数据并导致程序以令人讨厌的方式崩溃的好方法。

实际上,即使是第一次,您也很幸运。 Sizeof 返回变量类型的大小,它是一个指针,而不是字符串的长度。即使您使用了 strlen(string1),您也必须添加 1 以便为终止字符串的空字符留出空间。

C 会让你自爆。您有责任确保不这样做,和/或使用 lint 等工具对您的代码运行额外的测试,以捕获其他语言总是检查的一些错误。 (或者以更高的警告级别运行编译器。)

另一方面,能够在你真正想要的时候在 C 中作弊是让它变得强大的原因之一——比如汇编代码,如果你知道你在做什么,你就可以打破规则去做否则很难甚至不可能的事情。这是一把锋利的刀。请小心了解您周围的情况,以防滑倒。

【讨论】:

    【解决方案2】:

    您的代码中存在一些问题。

    1. 你认为sizeof(string1) 应该返回什么?你试过吗?你知道sizeof()strlen() 之间的区别吗?顺便说一句,sizeof(string1) 将返回指向 char 的指针的大小(以字节为单位),通常为 4 个字节。

    2. 查看strcat()documentation

    "destination:指向目标数组的指针,它应该包含一个C 字符串,并且足够大以包含连接的结果 字符串。”

    如果它“工作”了几次,并不意味着代码是正确的。您必须了解您正在将信息写入一块您未分配的内存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多