c - 每次更改其内容时都需要更改 char 指针的大小吗?

标签 c pointers char malloc string-concatenation

我将 target 的大小定义为 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 返回变量类型的大小,它是一个指针,而不是字符串的长度。即使您使用了 strlen(string1),您也必须加 1 以便为终止字符串的空字符留出空间。

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

另一方面,当你真的想用 C 语言作弊是它强大的原因之一——就像汇编代码一样,如果你知道自己在做什么,你就可以打破规则去做否则很难甚至不可能的事情。这是一把锋利的刀。小心了解周围的情况,以防滑倒。

关于c - 每次更改其内容时都需要更改 char 指针的大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21638303/

相关文章:

C - 编写 makefile 及其工作原理

c - c 中的字符串分词器直到制表符和换行符

c - C 中的结构体大小

c - 指针结构的问题

c - 将备用文件逐行打印到 c 中的第三个文件中

c - 井字游戏中的错误

c - 定义结构的程序局部指针

c++ - 分割字符数组

kotlin - 运算符 '==' 不能应用于 'Boolean' 和 'Char'

string - Rust 替换字符串中的 char 不起作用