首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C中的指针和字符串,不同的问题

C中的指针和字符串,不同的问题
EN

Stack Overflow用户
提问于 2013-06-28 23:30:25
回答 4查看 334关注 0票数 2

版本1

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
 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

代码语言:javascript
运行
复制
 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挂起了开发c++?,版本2说在cad2=cad1中有一个不兼容的赋值?为什么版本3正常工作?

EN

回答 4

Stack Overflow用户

发布于 2013-06-28 23:35:54

当你像这样声明指针时,

代码语言:javascript
运行
复制
char *cad1="hell";

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

但是当你声明它为,

代码语言:javascript
运行
复制
char cad2[]="hell";

"hell"存储为数组成员。也就是说,它将存储为,

代码语言:javascript
运行
复制
cad[0] = 'h', cad[1] = 'e', cad[2] = 'l', cad[3] = 'l', cad[4] = '\0'

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

由于您正在更改指向constant literalcad1,因此您的应用程序挂起。

在版本2中,cad1cad2都是数组类型。C中的直接数组赋值是非法的。所以你弄错了。请参考this link以了解其他人提到的所有详细信息。

为了回答版本3的工作原理,

cad1是一个数组,cad2是这里的指针。通过语句cad2 = cad1,您可以让cad2指向可以修改的内存(当然,大小是有限制的)。所以改变cad1cad2是一样的,因为它们指向相同的可修改内存。

票数 6
EN

Stack Overflow用户

发布于 2013-06-28 23:34:39

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-06-28 23:36:29

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

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

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

你真的应该写const char* cad="hell";。较新的c++编译器将坚持这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17368373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档