以下程序运行的结果是 。 #include<stdio.h> #include

以下程序运行的结果是。#include<stdio.h>#include<string.h>fun(char*w,intn){chart,*s1,*s2;s1=w;s2=... 以下程序运行的结果是 。
#include<stdio.h>
#include<string.h>
fun(char *w, int n)
{
char t,*s1,*s2;
s1=w; s2=w+n-1;
while(s1<s2)
{
t=*s1++;
*s1=*s2--;
*s2=t;
}
}
void main()
{
char *p;
p=”1234567”;
fun(p, strlen(p));
puts(p);
}
A.7654321 B.1714171
C.1711717 D.7177171
展开
 我来答
贴吧小官家
2013-12-08 · TA获得超过118个赞
知道答主
回答量:84
采纳率:0%
帮助的人:59.9万
展开全部
#include<stdio.h>
#include<string.h>
//====== 函数部分=========
 fun(char *w, int n)
{
 char t,*s1,*s2;   //定义字符t,字符指针s1,s2
   s1=w;  s2=w+n-1; //将上面的指针p赋予指针s1,s2是在s1右移7-1=6 实际*s2='7'
      while(s1<s2) //当s1指向的地址,少于s2指向的地址时【偏移6个单位s2=s1+7-1】
   {
      t=*s1++;    //s1先赋予t,那就是'1',后自增1
      *s1=*s2--; //s2先赋予*s1那就是'7',此时*s1=='7' ,后自减1
      *s2=t;    //将t的值(也就是1)赋予*s2,此时*s2=='1'
   }       
/* 
因为偏移量为6(s2=s1+6)假设s1=0x42201c则s2=0x422022 
那么地址是这么存的:
    内存地址   储存的数据(16进制)     ASCII
    0x42201c       0x31                   '1'     <-  s1的指向   往下加6
    0x42201d       0x32                   '2'
    0x42201e       0x33                   '3'
    0x42201f       0x34                   '4'
    0x422020       0x35                   '5'
    0x422021       0x36                   '6'
    0x422022       0x37                   '7'     <-  s2的指向  +6后
由 t=*s1++  可知  s1往下向s2靠近    由*s1=*s2--可知s2往上向s1 靠近
当s1==s2=0x42201f  时条件不再成立 (循环了3次)
第一次:
t=*s1='1'  ;
 s1++;  0x42201d    '2'
*s1=*s2;0x42201d    '2' 被*s2改写   0x42201d    '7'   *s2是等于'7'的
s2-- ;  0x422021    '6'
*s2=t;  0x422021    '6' 被t改写     0x422021    '1'   t是等于'1'的  
此时内存分布:
    内存地址   储存的数据(16进制)     ASCII
    0x42201c       0x31                   '1'     被*s2改写
    0x42201d       0x37                   '7'     <-  s1的指向   加1后
    0x42201e       0x33                   '3'
    0x42201f       0x34                   '4'
    0x422020       0x35                   '5'
    0x422021       0x31                   '1'    <-  s2的指向   减1后  被t改写
    0x422022       0x37                   '7'    
第二次:
t=*s1='7';   //s1的内存值是:0x42201d  '7'
 s1++;  0x42201e    '3'
*s1=*s2;0x42201e    '3' 被*s2改写   0x42201e    '1'   *s2是等于'3'的
s2-- ;  0x422020    '7'
*s2=t;  0x422020    '5' 被t改写     0x422020    '7'   t是等于'7'的  
此时内存分布:
    内存地址   储存的数据(16进制)     ASCII
    0x42201c       0x31                   '1'     
    0x42201d       0x37                   '7'     
    0x42201e       0x31                   '1'    <-  s1的指向 加1后  被*s2改写
    0x42201f       0x34                   '4'
    0x422020       0x37                   '7'    <-  s2的指向 减1后  被t改写
    0x422021       0x31                   '1'    
    0x422022       0x37                   '7'    
第三次:
t=*s1='1';   //s1的内存值是:0x42201e  '1'
s1++;  0x42201f    '4'
*s1=*s2;0x42201f    '4' 被*s2改写   0x42201f    '7'   *s2是等于'7'的
s2-- ;  0x42201f    '7'
*s2=t;  0x42201f    '7' 被t改写     0x42201f    '1'   t是等于'1'的  
此时内存分布:
    内存地址   储存的数据(16进制)     ASCII
    0x42201c       0x31                   '1'    
    0x42201d       0x37                   '7' 
     0x42201e       0x31                   '1'
    0x42201f       0x31                   '1'  <-  s2的指向  <-  s1的指向
    0x422020       0x37                   '7'
    0x422021       0x31                   '1'  
    0x422022       0x37                   '7'  
最后内存被改成这样,然后输出:
0x42201c~0x422022   '1711717'
*/
 }

void main(){
char *p  //字符指针
p="1234567"   //将字符串 1234567  赋予 p
fun(p,strlen(p)) //分别将形参 指针p, 和p的长度传给func ,等价于func(0x10000000,7) 0x1000000是p的内存地址,7是p的长度
put(p);//输出p的内容
}

//           C.1711717    纯手工打字, 学汇编的心血来潮写多了,写的不好望指正,写的好欢迎采纳,谢谢!

追问
嗯,好的,你答案对了
035东海龙子
2013-12-08 · TA获得超过113个赞
知道答主
回答量:224
采纳率:0%
帮助的人:101万
展开全部
没有答案,在main里面p只向的是一个字面值符的字符串,这种字符串是只读属性,不能写的,而fun函数里面s1/s2也都是指向这个字面符,*s1=*s2--和*s2=t;试图经过s1/s2改字面符里面的内容都会使程序崩溃
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式