版本1
char *cad1="hell";
char *cad2="home";
int j;
cad2=cad1;
for (j=0;j<4;j++){
printf("%c",cad1[j]);
}
cad2[0]='a';
for (j=0;j<4;j++){
printf("%c",cad2[j]);
}
Run Code Online (Sandbox Code Playgroud)
版本2
char cad1[]="hell";
char cad2[]="home";
int j;
cad2=cad1;
for (j=0;j<4;j++){
printf("%c",cad1[j]);
}
cad2[0]='a';
for (j=0;j<4;j++){
printf("%c",cad2[j]);
}
Run Code Online (Sandbox Code Playgroud)
版本3
char cad1[]="hell";
char *cad2="home";
int j;
cad2=cad1;
for (j=0;j<4;j++){
printf("%c",cad1[j]);
}
cad2[0]='a';
for (j=0;j<4;j++){
printf("%c",cad2[j]);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么版本1挂起了dev c ++ ?,版本2说在cad2 = cad1中有一个不兼容的赋值?为什么版本3工作正常?
当你声明指针时,
char *cad1="hell";
Run Code Online (Sandbox Code Playgroud)
"hell"被称为常量字符串文字,因此可以存储在只读存储器中. - 编译器可以自由选择它喜欢的任何东西.
但是当你宣布它时,
char cad2[]="hell";
Run Code Online (Sandbox Code Playgroud)
"hell"存储为数组成员.即,它将被存储为,
cad[0] = 'h', cad[1] = 'e', cad[2] = 'l', cad[3] = 'l', cad[4] = '\0'
Run Code Online (Sandbox Code Playgroud)
C不保证任何已定义的更改行为constant literals.它可能会崩溃挂起或破坏其他有效数据.它被称为未定义的行为.
由于您正在更改cad1指向constant literal您的应用程序挂起.
在版本2中,既cad1和cad2是阵列类型.直接阵列分配C是非法的.所以你得到了错误.有关其他人提及的所有详细信息,请参阅此链接.
要回答版本3的工作原理,
cad1是一个数组,并cad2在这里指针.通过cad2 = cad1您所做的声明cad2指出可以修改的内存(仍然,大小受限).所以改变cad1和cad2相同,他们指向相同的可修改内存.