实现将字符串常量s2的值赋给字符串常量s1,让字符串s1输出字符串s2的值,为什么无法实现?

a1qwertyuiop1 2017-08-13 02:50:34
实现将字符串常量s2的值赋给字符串常量s1,让字符串s1输出字符串s2的值,为什么无法实现? 问题如下:
#include <stdio.h>
#include"stdlib.h"
main()
{
char y[9];
char *s1="iya";
char *s2="abc";
for(;*s2;s1++,s2++){
s1=s2; //这行将s2的地址赋给s1,是不是相当于将地址对应的值赋给s1,也就是实现*s1=*s2.
}
*s1='\0';
s1=&s2[0]; //这行是不是相当于将指针s1指向s2的首地址,
printf("%s",s1);
system("pause");
}
...全文
602 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-08-14
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
棉猴 2017-08-14
  • 打赏
  • 举报
回复
引用 6 楼 a1qwertyuiop1 的回复:
下面这段代码输出结果为abc,为何这里字符串常量s1的值却可以修改为abc? 之前的代码却不可以?
#include <stdio.h>
#include"stdlib.h"
main()
{
char y[9];
char *s1="iya";
char *s2="abc";
int i=0;
for(;*s1;s1++,s2++,i++){
y[i]=*s2;
}
*s1='\0';
s1=&y[0];
printf("%s",s1);
system("pause");
}

你的这个程序改变的并不是"iya",而是s1指针的内容,使s1指向了数组y。



从第3张图可以看到,保存字符串iya的地址0x01266b30中的内容并没有改变;改变的是s1的内容,s1指向的内容变为了abc。
在VS2015+Windows10 64位调试的过程中,你的代码还需要修改一下:
1将char y[9];改为char y[9]={0};即对数组y进行初始化,否则输出的s1有“烫”字;
2将 *s1='\0';注释掉,从第二张图可以看到,此时s1的值是0x01266b33,对该处内存地址赋值时不允许的,要报错。
棉猴 2017-08-14
  • 打赏
  • 举报
回复
引用 10 楼 wenpinglaoyao 的回复:
[quote=引用 1 楼 hou09tian 的回复:] VS2015+Windows10 64位调试得到如下信息 对于
    for(;*s2;s1++,s2++){
      s1=s2;                         //这行将s2的地址赋给s1,是不是相当于将地址对应的值赋给s1,也就是实现*s1=*s2.
    } 
此时s1的值是0x002a6b30;s2的值是0x002a6b34。第一次执行for循环内的执行语句,s1的值变为0x002a6b34;之后执行for循环的表达式语句,此时s1和s2的值都是0x002a6b35,第二次执行for循环内的执行语句,两个变量值都是0x002a6b35,实际上for循环内的执行语句并没有起作用,这两个变量始终都相等。最后s1和s2的值都是0x002a6b37,此时如果再赋值
*s1='\0';
就会报错,因为0x002a6b37这个位置是不能赋值的(没有对这个内存地址进行声明) 而
s1=&s2[0];                   //这行是不是相当于将指针s1指向s2的首地址,
是正确的,就相当于
您好朋友,您回答里面的图片是怎么搞出来的,调试时visual studio给您做出来的??[/quote] WPS里面的画图功能
赵4老师 2017-08-14
  • 打赏
  • 举报
回复
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
沐阳2100 2017-08-14
  • 打赏
  • 举报
回复
char*赋初值后是字符串常量,不可改!
纹枰老妖 2017-08-14
  • 打赏
  • 举报
回复
引用 1 楼 hou09tian 的回复:
VS2015+Windows10 64位调试得到如下信息 对于
    for(;*s2;s1++,s2++){
      s1=s2;                         //这行将s2的地址赋给s1,是不是相当于将地址对应的值赋给s1,也就是实现*s1=*s2.
    } 
此时s1的值是0x002a6b30;s2的值是0x002a6b34。第一次执行for循环内的执行语句,s1的值变为0x002a6b34;之后执行for循环的表达式语句,此时s1和s2的值都是0x002a6b35,第二次执行for循环内的执行语句,两个变量值都是0x002a6b35,实际上for循环内的执行语句并没有起作用,这两个变量始终都相等。最后s1和s2的值都是0x002a6b37,此时如果再赋值
*s1='\0';
就会报错,因为0x002a6b37这个位置是不能赋值的(没有对这个内存地址进行声明) 而
s1=&s2[0];                   //这行是不是相当于将指针s1指向s2的首地址,
是正确的,就相当于
您好朋友,您回答里面的图片是怎么搞出来的,调试时visual studio给您做出来的??
jena_wy 2017-08-14
  • 打赏
  • 举报
回复
s2一直++,指向一个空才停止下来,然后把s2赋给s1,s1当然没有值了。
自信男孩 2017-08-14
  • 打赏
  • 举报
回复
s1, s2是指向只读数据段,那么就不能被修改。另外,赋值也是有问题,即使s1是可读可写的,那么赋值也不能是s1 = s2,而是 *s1 = s2; 代码如下:
#include <stdio.h>
#include"stdlib.h"
int main()
{
    char y[9];
    char *s1= y;
    char *s2="abc";

    for(;*s2;s1++,s2++){
        *s1 = *s2;
    }
    *s1 = '\0';

    printf("%s\n", y);
    system("pause");
}
a1qwertyuiop1 2017-08-13
  • 打赏
  • 举报
回复
下面这段代码输出结果为abc,为何这里字符串常量s1的值却可以修改为abc? 之前的代码却不可以? #include <stdio.h> #include"stdlib.h" main() { char y[9]; char *s1="iya"; char *s2="abc"; int i=0; for(;*s1;s1++,s2++,i++){ y[i]=*s2; } *s1='\0'; s1=&y[0]; printf("%s",s1); system("pause"); }
a1qwertyuiop1 2017-08-13
  • 打赏
  • 举报
回复
同样是字符串常量,为何这里字符串常量s1的值却可以修改? #include <stdio.h> #include"stdlib.h" main() { char y[9]; char *s1="iya"; char *s2="abc"; int i=0; for(;*s1;s1++,s2++,i++){ y[i]=*s2; } *s1='\0'; s1=&y[0]; printf("%s",s1); system("pause"); }
棉猴 2017-08-13
  • 打赏
  • 举报
回复
引用 3 楼 a1qwertyuiop1 的回复:
既然s2各个字符地址已经传给了s1.为何没将值"abc"传过去呢?
"abc"、“iya”是字符串常量,是不能被修改的。
a1qwertyuiop1 2017-08-13
  • 打赏
  • 举报
回复
既然s2各个字符地址已经传给了s1.为何没将值"abc"传过去呢?
棉猴 2017-08-13
  • 打赏
  • 举报
回复
对于for循环语句的初始化语句、条件语句、表达式语句和执行语句的含义,请看 http://blog.csdn.net/hou09tian/article/details/77001685 我自己写的一篇关于for循环的小文章,请多指教
棉猴 2017-08-13
  • 打赏
  • 举报
回复
VS2015+Windows10 64位调试得到如下信息

对于
    for(;*s2;s1++,s2++){
s1=s2; //这行将s2的地址赋给s1,是不是相当于将地址对应的值赋给s1,也就是实现*s1=*s2.
}

此时s1的值是0x002a6b30;s2的值是0x002a6b34。第一次执行for循环内的执行语句,s1的值变为0x002a6b34;之后执行for循环的表达式语句,此时s1和s2的值都是0x002a6b35,第二次执行for循环内的执行语句,两个变量值都是0x002a6b35,实际上for循环内的执行语句并没有起作用,这两个变量始终都相等。最后s1和s2的值都是0x002a6b37,此时如果再赋值
*s1='\0';

就会报错,因为0x002a6b37这个位置是不能赋值的(没有对这个内存地址进行声明)

s1=&s2[0];                   //这行是不是相当于将指针s1指向s2的首地址,

是正确的,就相当于

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧