2

版本 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]);
  }

第 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]);
  }

第 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]);
  }

我的问题是为什么版本 1 挂起 dev c++?,版本 2 说在 cad2=cad1 中有不兼容的分配?为什么版本 3 工作正常?

4

4 回答 4

6

当您声明指针时,

char *cad1="hell";

"hell"被称为常量字符串文字,因此可以存储在只读存储器中。- 编译器可以自由选择它喜欢的任何东西。

但是,当您将其声明为,

char cad2[]="hell";

"hell"存储为数组成员。即,它将被存储为,

cad[0] = 'h', cad[1] = 'e', cad[2] = 'l', cad[3] = 'l', cad[4] = '\0'

C不保证任何已定义的更改行为constant literals。它可能会崩溃挂起或破坏其他有效数据。它被称为未定义的行为

由于您正在更改cad1指向constant literal您的应用程序的哪个挂起。


在版本 2 中,cad1cad2都是数组类型。直接数组赋值C是非法的。所以你有错误。有关其他人提到的所有详细信息,请参阅此链接。


要回答为什么版本 3 有效,

cad1是一个数组,cad2这里是指针。通过cad2 = cad1cad2指出可以修改的内存的声明(仍然,大小受到限制)。所以变化cad1cad2相同,因为它们指向相同的可修改内存。

于 2013-06-28T15:35:54.120 回答
0

在版本 1 中,cad2等于cad1which 指向常量 string "hell"。稍后,您尝试修改该常量字符串,这是不可预测的。相比之下,版本 3 已cad1声明为char数组,因此您会获得字符串的非常量副本,因此可以修改它。

对于版本 2,这可能是因为两者都是数组(不是指针),所以我确信那里存在一些问题。

于 2013-06-28T15:34:38.873 回答
0

如果cad声明为char* cad="hell";then 那是一个字符串文字(长度为 4 加 1 用于空终止符),并且任何修改字符串文字的尝试都是未定义的行为。什么事情都可能发生。

char cad[]="home";将在堆栈上分配 5char秒,cad[4] 是 '\0' - 空终止符;C 中的许多字符串函数在将一组chars 建模为字符串以标记字符串结尾时使用。您可以自由修改这些数据,尽管cad[4]在使用 C 字符串库函数时更改会给您带来麻烦,因为您将删除它们的停止条件。

在整个代码中,cad2=cad1;请注意,这不会复制字符串,只是复制指针;在strcpyC 标准库中用于复制字符串。

真的你应该写const char* cad="hell";。较新的 c++ 编译器会坚持使用它。

于 2013-06-28T15:36:28.840 回答
0
  • 为什么版本 1 会挂起 dev c++?

阅读评论:

char *cad1="hell";  // pointer to constant string "hell"
char *cad2="home";
cad2=cad1;          // now cad2 points to constant string "hell" too
cad2[0]='a';        // modifying of constant string causes undefined behaviour.
  • 版本 2 说 cad2=cad1 中存在不兼容的分配?

阅读评论:

char cad2[]="home";  // cad2 is array
cad2=cad1;           // error because you can not assign to arrays in C.
  • 为什么版本 3 工作正常?

阅读评论:

char cad1[]="hell";  // cad1 is array
char *cad2="home";
cad2=cad1;           // now cad2 point to first element of array cad1
cad2[0]='a';         // you can modify arrays in C

请注意,您不能分配给数组,但您可以通过复制或为其元素分配值来修改它们。

于 2013-06-28T16:14:27.487 回答