C中的指针和字符串,各种各样的问题

Lay*_*yla 2 c string

版本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工作正常?

Voi*_*ter 6

当你声明指针时,

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中,既cad1cad2是阵列类型.直接阵列分配C是非法的.所以你得到了错误.有关其他人提及的所有详细信息,请参阅此链接.


要回答版本3的工作原理,

cad1是一个数组,并cad2在这里指针.通过cad2 = cad1您所做的声明cad2指出可以修改的内存(仍然,大小受限).所以改变cad1cad2相同,他们指向相同的可修改内存.

  • 仅供参考,它被称为"未定义的行为". (3认同)