关于char指针的一些问题

m4d*_*ign 2 c pointers char

1-这是如何工作的:

char *ptr = "hi";
Run Code Online (Sandbox Code Playgroud)

现在编译器会把这个字符串放在内存中(我在猜测堆栈),并创建一个指向它的指针?这是它的工作原理吗?

2-如果它是在函数中本地创建的,当函数返回时,字符串占用的内存是否会被释放?

3-最后但并非最不重要的,为什么不允许这样做ptr[0] = 'H';

Jer*_*fin 6

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标准的角度来看,唯一合理的答案是将其称为未定义的行为.