one直接指向位于只读页面中的字符串。另一方面,
two是在堆栈上分配的数组,并使用一些常量数据进行初始化。在运行时,可执行文件的只读部分中的字符串将被复制到堆栈中。您要修改的是该字符串在堆栈上的副本,而不是只读存储器页面。
从语言的角度来看,在更高层次上
"abcd"是type
constchar*而不是的表达
char*。因此,修改此类表达式所指向的值会导致未定义的行为。该语句
char* one ="something";仅将指向字符串的指针存储在变量中(不安全,因为它正在抛弃
const修饰符)。的
char two[] ="something";是完全不同的。它实际上是在声明一个数组并对其进行初始化,就像
int a[] ={1,2,3};。引号中的字符串是初始化表达式。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)