1

这是好习惯吗?代码编译并运行,但我想知道这是否是在 C 代码中模拟的好习惯,

  1. 我们写const char *str1 = "abc";
  2. 然后稍后,假设有一个指针变量char *str2指向动态分配的内存
  3. 然后我们str1 = str2现在都这样做str1str2指向动态分配的内存

所以现在我们已经失去了任何指向"abc". 虽然在这段代码中,我们可能不需要它,但我想知道处理这些的最佳推荐方法是什么。

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

4

3 回答 3

3

绝对没问题。const char *str1意思是“一个可以修改的指针,指向不能修改的字符数据(通过这个指针)”。

因此,您可以指向str1您喜欢的任何字符串,并且“重新安装”它以在不同时间指向不同的字符串是有意义的。

显然,如果您的代码足够复杂,您可能会使读者难以计算出变量当前包含的内容,但所有变量都是如此。例如,您要小心有时指向字符串文字、有时指向动态分配的内存的指针,因为是否应该free编辑指针可能并不总是很清楚。

如果你想str1总是指向同一个字符串,你会定义它const char * const str1(或者char const *const str1为了使位置const始终一致)。在这种情况下,这不是您想要的,而且您没有声明str1const 的事实向读者表明了这一点。

于 2013-02-15T11:00:05.670 回答
1

丢失指向字符串文字的指针不会导致内存泄漏,因此您所做的在这方面是安全的。

于 2013-02-15T10:17:54.543 回答
1

字符串文字"abc"不是动态分配的,因此在这种情况下不会泄漏。

字符串文字是“程序映像”的一部分,在启动时由操作系统的可执行加载程序加载到内存中。进程结束后,该映像占用的空间将由操作系统回收。当然,这不是很准确,因为有诸如按需分页和写时复制之类的技术,但它们与这种情况无关。

如果您不const输入该定义,那将是一个问题。后者将允许您尝试修改通常存储在进程的只读区域中的一块内存,因此会出现未定义的行为。

于 2013-02-15T10:25:27.290 回答