1-这是如何工作的:
char *ptr = "hi";
Run Code Online (Sandbox Code Playgroud)
现在编译器会把这个字符串放在内存中(我在猜测堆栈),并创建一个指向它的指针?这是它的工作原理吗?
2-如果它是在函数中本地创建的,当函数返回时,字符串占用的内存是否会被释放?
3-最后但并非最不重要的,为什么不允许这样做ptr[0] = 'H';?
1)字符串不(通常)在堆栈上 - 它通常位于直接从可执行文件中读取的初始化数据段中.然后将指针初始化为该字符串的地址.
2)不.
3)因为标准说它给出了未定义的行为.考虑一下你是否有这样的事情:
int a() { char *a = "a"; printf("%s\n", a); }
int b() { char *b = "a"; *b = 'b'; }
int main() {
b();
a();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,当您打印出来时a,您是否希望获得原始值(a)或更新后的值(b)?编译器可以但不一定共享这样的静态字符串; 有些人还将整个区域标记为只读,因此尝试写入它将产生异常.
从C标准的角度来看,唯一合理的答案是将其称为未定义的行为.
| 归档时间: |
|
| 查看次数: |
189 次 |
| 最近记录: |