更改const char * str1 =“abc”

时间:2013-02-15 10:13:41

标签: c string char

这是好习惯吗?代码编译并运行,但我想知道这是一个很好的做法来模仿 在C代码中,

  1. 我们写const char *str1 = "abc";
  2. 然后,让我们说有一个指针变量char *str2指向动态分配的内存
  3. 然后我们执行str1 = str2所以现在str1str2指向动态分配的内存
  4. 所以现在我们已经忘记了"abc"的任何指针。虽然在这段代码中,我们可能不需要它,但我想知道处理这些的最佳推荐方法是什么。

    整体问题是我们需要一个最初声明为abc并稍后依赖于用户输入的字符串,我们可能想要使用用户提供的字符串。

3 个答案:

答案 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放在该定义中,那将是一个问题。后者允许您尝试修改通常存储在进程的只读区域中的内存,因此将显示未定义的行为。