这是好习惯吗?代码编译并运行,但我想知道这是一个很好的做法来模仿 在C代码中,
const char *str1 = "abc";
char *str2
指向动态分配的内存str1 = str2
所以现在str1
和str2
指向动态分配的内存所以现在我们已经忘记了"abc"
的任何指针。虽然在这段代码中,我们可能不需要它,但我想知道处理这些的最佳推荐方法是什么。
整体问题是我们需要一个最初声明为abc并稍后依赖于用户输入的字符串,我们可能想要使用用户提供的字符串。
答案 0 :(得分:3)
绝对没问题。 const char *str1
表示“可以修改的指针,无法修改的字符数据(通过此指针)”。
因此,您可以将str1
指向您喜欢的任何字符串,并且将其“重置”以指向不同时间点的不同字符串是有意义的。
显然,如果你的代码足够复杂,你可能会让读者难以弄清楚变量当前包含的内容,但所有变量都是如此。例如,您需要注意有时指向字符串文字的指针,有时指向动态分配的内存,因为指针应该free
编辑可能并不总是很清楚。
如果您希望str1
始终指向相同的字符串,则应将其定义为const char * const str1
(或char const *const str1
,以使const
的位置始终保持一致)。在这种情况下,这不是你想要的,而且你没有声明str1
const这一事实对读者来说意味着什么。
答案 1 :(得分:1)
丢失指向字符串文字的指针不会导致内存泄漏,所以你所做的就是安全。
答案 2 :(得分:1)
字符串文字"abc"
未动态分配,因此在这种情况下没有任何东西可以泄露。
字符串文字是“程序映像”的一部分,它在启动时由操作系统的可执行加载程序加载到内存中。一旦过程结束,操作系统将回收该映像占用的空间。当然这不是很准确,因为有需求分页和写时复制等技术,但它们与那种情况无关。
如果您没有将const
放在该定义中,那将是一个问题。后者允许您尝试修改通常存储在进程的只读区域中的内存,因此将显示未定义的行为。