char ch[10] = "abcdefg";
char* p1 = ch;
char* p2 = "hijklmn"; //这种赋值方式符合规范吗?
puts(p1); //正常输出abcdefg
puts(p2); //正常输出hijklmn
p1[2] = p2[2];
puts(p1); //输出abjdefg
p2[3] = p1[3];
puts(p2); //无法输出,程序在上一条语句终止,且不报错
大家知道怎么回事吗??
char ch[10] = "abcdefg";
char* p1 = ch;
char* p2 = "hijklmn"; //这种赋值方式符合规范吗?
puts(p1); //正常输出abcdefg
puts(p2); //正常输出hijklmn
p1[2] = p2[2];
puts(p1); //输出abjdefg
p2[3] = p1[3];
puts(p2); //无法输出,程序在上一条语句终止,且不报错
大家知道怎么回事吗??
char* p2 = "hijklmn"; 和char ch[10] = "abcdefg";,前者改变其内
容程序是会崩溃的,而后者完全正确
char ch[10] = "abcdefg";
char* p2 = "hijklmn";
abcdefg是在运行时刻赋值的;在栈区
而hijklmn是在编译时就确定的;在文字常量区
。char* p2 = "hijklmn";
实际上先是在文字常量区分配了一块内存放"hijklmn",然后在栈上分配一地址给p2并指向
这块地址,然后改变常量自然会崩溃
"abcdefg";在栈区所以没关系。
程序十分危险,可能会覆写掉内存中的某些重要数据,导致系统崩溃
应该为char ch2[10] = ""hijklmn";