在您的特定示例中,您正在泄漏内存并最终导致尝试释放常量 string 的未定义行为"string"
,因为您首先分配memory
,然后为其分配地址"string"
,因此失去了对原始分配的跟踪。
您需要使用strcpy(memory, "String");
来复制字符串。
现在,除此之外,除非你只是这样做,否则你会浪费很多时钟周期,因为malloc
它们free
不是自由操作,它们需要时间,当然,复制字符串也需要一些操作。最重要的是,分配的内存malloc
将比实际的字符串占用更多的空间,这既是因为malloc
和free
函数需要一些“靠近”内存块的信息才能完成它们的工作,而且因为通常, size 被四舍五入到某个“好的”大小,例如 8、16 或 32 字节。这意味着您不仅浪费了调用 malloc 和 free 的时钟周期,而且还使用了比实际要求更多的内存。因此,您可能使用的是 40 或 64 字节,而不是使用 7 个字节。
另一方面,如果您想修改字符串,那么您不能只将现有内存"String"
用于undefined behaviour
在任何现代操作系统上崩溃)。但是,还有其他几种可能的解决方案,例如:
char local[15] = "String";
将为您在堆栈上的字符串提供 15 个字节的空间 - 谈论的空间量没有开销 [最多 7 个字节],我们可以忽略在堆栈上分配它的开销,因为如果您完全使用局部变量,则必须有一条指令 - 它是所有局部变量一起使用的一条指令。
此解决方案允许修改字符串(例如strcat(local, " abc");
制作"string abc"
. 只需确保您知道自己在做什么,并且不要覆盖允许空间的末尾[并且不要忘记在字符串末尾计算零) ]。