作者firose (guest)
站内C_and_CPP
标题Re: [问题] char *str="test"是const字串的问题
时间Fri Nov 18 15:57:36 2005
※ 引述《Aligu1009 (=.=)》之铭言:
:
: ... 略
:
: 只是 str1指的东西,为什麽要放到唯读区呢?
: 改以int*为例
: 我们通常会用
: int i=5;
: int *ptr = &i;
: 这时我们仍可更改 *ptr
: 因为 i 并非在唯读区
: 但改成 char* 後
: 我会直观的认为 (虽然这样是错的)
: char *ptr = "test";
: "test"应该也要被放在非唯读区
我觉得您的问题可能是误解了 char str[] = "test" 这句
它的作法是先在某一块记忆体 memory_a 中存放这五个字元 't', 'e', 's', 't', '\0'
然後再从 stack 找一块空间 memory_b, 然後把 memory_a 开始的那五个字元拷贝过去
由於 memory_b 的型态是 char [] 不是 const char[] 因此可以更改
至於 char *str = "test" 也是一样, 先在 memory_a 存放 "test" 这个字串常数
然後在 stack 找一块空间给 str, 大小就仅是一个指标大小, 然後令它指向 memory_a
但是严格来说 "test" 是 const char[] 指标要指向它的话型态应该要是 const char*
而今天 char *str 可以指向它有某种特别的原因, 就如 cppOrz 大大文章中所说的那些
您以下面这个例子来类比并不合适, 因为光是叙述结构就跟首篇的 char str[] 不同
int i = 5;
int *pi = &i;
如果以上面的结构来说的话, 类比的叙述是像下面这样
char str[] = "test";
char *pstr = str;
当然可以想见, 可以透过 pstr 来修改 str. 就如同可以透过 pi 来修改 i.
常数值顾名思义本来就是不能修改,不管是放在哪里 (前面文章说的 const data 区,或
overlapping objects 或者可能有其他地方) 至少编译器得限制您的修改权,让您无法去
修改 "test" 的值。当然今天编译器允许您用 char * 指向它 (因为某些原因),就有可
能会使您写出用 char * 指标来修改 "test" 值的程式码,编译会过,但是其行为是未定
义的。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.104.235.75