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

时间:2013-06-28 15:30:25

标签: 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]);
  }

第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 个答案:

答案 0 :(得分: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中的直接阵列分配是非法的。所以你得到了错误。有关其他人提及的所有详细信息,请参阅this link


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

cad1是一个数组,cad2是指针。通过语句cad2 = cad1,您使cad2指向可以修改的内存(仍然,大小受限)。因此,更改cad1cad2与指向相同的可修改内存相同。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

char cad[]="home";会在堆栈上分配5个char,cad [4]是&#39; \ 0&#39; - 空终止符; C中的许多字符串函数用于将一组char建模为字符串以标记字符串结尾。您可以自由修改这些数据,虽然更改cad[4]会导致您在使用C字符串库函数时遇到麻烦,因为您将删除它们的停止条件。

在整个代码中,您有cad2=cad1;请注意,这不会复制字符串,只会复制指针;使用C标准库中的strcpy来复制字符串。

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

答案 3 :(得分: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

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