在C中初始化一个char指针.为什么认为危险?

Pit*_*kos 5 c pointers initialization char

可能重复:
C中的char s []和char*s有什么区别?

我初始化一个char指针:

char *a="test";
Run Code Online (Sandbox Code Playgroud)

我在某些地方读到这被认为是只读的,这很危险.

这是否意味着"test"堆中没有分配空间?这是否意味着字符串"test"可以在程序中稍后写入?

---扩大我的问题---

如果我已a按上述方式进行了初始化,那么我会进行一系列其他初始化,例如:

int b=20;
char c[]="blahblahblah";
Run Code Online (Sandbox Code Playgroud)

内存中的"测试"会被"20"或"blah"覆盖吗?或者这种情况没有根据?

Mys*_*ial 14

这很危险,因为字符串不可修改.尝试这样做会导致未定义的行为.

所以最好这样做:

const char *a = "test";
Run Code Online (Sandbox Code Playgroud)

你是正确的,"test"在这种情况下,没有在堆或堆栈*上分配,而是位于不可修改的静态内存中.

*标准对堆栈或堆没有任何说明,尽管它通常是如何实现的.

另一方面:

char a[] = "test";
Run Code Online (Sandbox Code Playgroud)

可以安全修改,因为它只是简短形式:

char a[] = {'t','e','s','t','\0'};
Run Code Online (Sandbox Code Playgroud)

这是一个普通的可修改数组.

  • 还有`char*a ="你好"; char*b ="hello";`在某些平台上,`a == b`,在某些`a!= b`上.因此,如果成功改变,可能会或可能不会改变另一个.允许但不是必需的实现来合并相同的字符串常量. (4认同)