【问题标题】:In C, what is the difference between char* and char[]? [duplicate]在 C 中,char* 和 char[] 有什么区别? [复制]
【发布时间】:2019-06-10 11:23:54
【问题描述】:

我知道很多人都问过这个问题,但我仍然对此有一些疑问。 我读了那篇文章:

char *string = "mystring";

如果我想这样做,让它成为一个只读的字符数组:

string[0] = 'l';

我会得到一个错误。 当我写的时候:

char string[] = "mystring";

它保存在堆栈中,就在当前范围内。 char* 呢?它保存在堆上吗?还是在堆栈上?

当我尝试写作时:

char *string = "mystring";

然后:

string = "mystring2";

它起作用了,但是旧的“mystring”数组发生了什么?这样做会导致内存泄漏吗?

【问题讨论】:

  • "我会得到一个错误。" - 严格来说,你可能会,你可能不会;它是未定义的。您遇到的任何运行时错误都归结为操作系统或目标平台行为,而不是 C 运行时行为。最好通过const char *string = "mystring"; 获得编译时错误。

标签: c pointers


【解决方案1】:

char* 呢?它保存在堆上吗?还是在堆栈上?

char* 保存在堆栈中。但这只是一个指针。实际的字符串数据将存储在程序的可执行文件中(这发生在程序编译时,不是char *string = "mystring"; 将其放在那里)。对char* 的赋值会使用程序二进制文件中的"mystring" 地址对其进行初始化。

它起作用了,但是旧的“mystring”数组发生了什么?这样做会导致内存泄漏吗?

您的可执行文件将包含"mystring";"mystring2" 的内容。当您执行string = "mystring2"; 时,您会使指针从指向一个变为指向另一个。这里没有内存泄漏。

【讨论】:

  • 我想详细了解 OP 的示例,例如将指针从一个只读内存位置更改为另一个,尽管他观察到“字符串”不是可修改。
猜你喜欢
  • 2012-08-14
  • 2018-05-08
  • 1970-01-01
  • 2014-03-21
  • 2020-07-29
  • 2014-02-15
  • 2015-01-17
  • 2016-06-20
  • 2014-07-07
相关资源
最近更新 更多