字符指针与字符数组 绿色换红色出现问题

时间:2022-09-14 22:26:08
#include<stdio.h>
void strcopy(char *from,char *to)
{
  for(;*from!='\0';from++,to++)
  {
    *to=*from;
  }
  *to='\0';
}

int main()
{
  char *pc1="www.itzcn.com";
  
   /*char c[]="ChuangNeiWang";
  char *pc2=c;*/

   char *pc2="ChuangNeiWang";

  printf("未复制之前:\n");
  printf("第一个字符串的内容是:%s\n",pc1);
  printf("第二个字符串的内容是:%s\n",pc2);

  strcopy(pc1,pc2);

  printf("复制之后:\n");
  printf("第一个字符串的内容是:%s\n",pc1);
  printf("第二个字符串的内容是:%s\n",pc2);
  
  return 0;
}

7 个解决方案

#1


问题出在你的pc1

#include<stdio.h>
#include<string.h>
void strcopy(char *from,char *to)
{
for(;*from!='\0';from++,to++)
{
*to=*from;
}
*to='\0';
}
int main()
{
char pc1[]="www.itzcn.com";
  
char c[]="ChuangNeiWang";
char *pc2=c;
/*char pc2[]="ChuangNeiWang";*/

printf("复制之前:\n");
printf("第一个字符串的内容是:%s\n",pc1);
printf("第二个字符串的内容是:%s\n",pc2);

strcopy(pc1,pc2);

printf("复制之后:\n");
printf("第一个字符串的内容是:%s\n",pc1);
printf("第二个字符串的内容是:%s\n",pc2);
  
return 0;


我的理解是 :(纯属扯淡,楼主三思)
绿色时:你的pc1是指针型的,所以pc1的字符串长度不会变了,没有后继存储空间了;而pc2却是char[],长度是不确定的,可以有后继存储空间,你的copy函数是将pc1的内容复制给pc2,没问题,因为pc2删除了自己的字符串,存储空间还在。
红色时:pc2变成了指针行了,无法被复制了。

#2


不管绿色还是红色,pc1的使用都是错误的。
char *pc1 ="www.itzcn.com";  // 定义了一个指向 常量字符串的字符指针
既然是常量,那么任何试图修改其指向内容的操作都是错误的。可以试试定义pc1后这样的代码能执行成功吗? *pc1 = 'a';//把pc1的第一个字符换成'a'.

#3


char *pc1 ="www.itzcn.com";  // 定义了一个指向常量字符串的字符指针
动态分配内存啊

#4


char s[]="123"和char *s = "123"不是一个概念,一个是数组,一个是常量。常量是不可以修改的。所以你的strcopy函数会出问题。

#5


你的PC1和PC2都是指向字符常量指针,而你的strcopy是对常量修改当然会报错,省事的做法是把PC1,PC2换成数组,或者对PC1,PC2开辟空间。

#6


真是惭愧,看了各位大哥的解释,还是在云里,求简洁准确易懂的解释,我是小菜鸟。。。。

#7


#pragma comment(linker,"/SECTION:.rdata,RW")
//程序开头加这句可以让常量区可写,后果自负。

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

#1


问题出在你的pc1

#include<stdio.h>
#include<string.h>
void strcopy(char *from,char *to)
{
for(;*from!='\0';from++,to++)
{
*to=*from;
}
*to='\0';
}
int main()
{
char pc1[]="www.itzcn.com";
  
char c[]="ChuangNeiWang";
char *pc2=c;
/*char pc2[]="ChuangNeiWang";*/

printf("复制之前:\n");
printf("第一个字符串的内容是:%s\n",pc1);
printf("第二个字符串的内容是:%s\n",pc2);

strcopy(pc1,pc2);

printf("复制之后:\n");
printf("第一个字符串的内容是:%s\n",pc1);
printf("第二个字符串的内容是:%s\n",pc2);
  
return 0;


我的理解是 :(纯属扯淡,楼主三思)
绿色时:你的pc1是指针型的,所以pc1的字符串长度不会变了,没有后继存储空间了;而pc2却是char[],长度是不确定的,可以有后继存储空间,你的copy函数是将pc1的内容复制给pc2,没问题,因为pc2删除了自己的字符串,存储空间还在。
红色时:pc2变成了指针行了,无法被复制了。

#2


不管绿色还是红色,pc1的使用都是错误的。
char *pc1 ="www.itzcn.com";  // 定义了一个指向 常量字符串的字符指针
既然是常量,那么任何试图修改其指向内容的操作都是错误的。可以试试定义pc1后这样的代码能执行成功吗? *pc1 = 'a';//把pc1的第一个字符换成'a'.

#3


char *pc1 ="www.itzcn.com";  // 定义了一个指向常量字符串的字符指针
动态分配内存啊

#4


char s[]="123"和char *s = "123"不是一个概念,一个是数组,一个是常量。常量是不可以修改的。所以你的strcopy函数会出问题。

#5


你的PC1和PC2都是指向字符常量指针,而你的strcopy是对常量修改当然会报错,省事的做法是把PC1,PC2换成数组,或者对PC1,PC2开辟空间。

#6


真是惭愧,看了各位大哥的解释,还是在云里,求简洁准确易懂的解释,我是小菜鸟。。。。

#7


#pragma comment(linker,"/SECTION:.rdata,RW")
//程序开头加这句可以让常量区可写,后果自负。

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!