自加运算符有时会出乎你的意料!

  自加运算符在C语言中是非常常用的一种运算符,每个C程序中几乎除了#就是它了。但就是这么常用的,很多人用起来都很熟练的一个运算符可能会出一些出乎很多人意料的情况,而且在这种问题出来的时候很多人还根本不会意识到是X++除了毛病。

  在完成数据结构的作业时,我敲了一个关于串运算的代码,在使用指针的时候我用了一下自加运算符然后就出错了。以下是简化的代码,去掉了与问题无关的部分。

#include<stdio.h>
#include<stdlib.h>
void main(){
    void connect(char **T,char *s1);
    char *s,s1[20];
    gets(s1);
    connect(&s,s1);
}

void connect(char **T,char *s1){
    int i,L1; char *s;
    for(L1=0;*(s1+L1);L1++);
    *T=(char *)malloc(L1+1);
    s=*T;//保存头指针待用
    for(i=0;*s1;i++,*T++,s1++){
        printf("%x  %x  %x\n",(s+i),*T,s1);
        **T=*s1;
    }
}

这段代码是没法完整运算的,我只能以调试的状态下运行,里面的for循环运行了三次,就会出现如图的结果。printf打印的是地址的跟踪情况。

但说实话,我也只是发现了这种情况,并不知道真正的原因在哪。因为我没学过汇编,所以C编译后到底出现了怎样的情况我也不知道,我仅仅知道这个可能跟二重指针有关,希望能有高手指点一下问题所在。

时间: 2024-08-26 00:16:36

自加运算符有时会出乎你的意料!的相关文章

关于android中gridview数据量很大的时候,在加载gridview时会出现卡顿的现象

好的解决办法就是先加载一定数量的数据,然后在最下方提示正在加载! 动态加载就是把放入adapter中的数据分好几次加载.在用户拖动gridview时再加载一定的数据,和sina微博的客户端类似. 给gridview添加OnScrollListener监听事件默认会覆盖下面两个方法: 下面列举个列子: <com.ui.widget.LazyGridView xmlns:android="http://schemas.android.com/apk/res/android" andr

Python 中,字符串&quot;连接&quot;效率最高的方式是?一定出乎你的意料

网上很多文章人云亦云,字符串连接应该使用「join」方法而不要用「+」操作.说前者效率更高,它以更少的代价创建新字符串,如果用「+」连接多个字符串,每连接一次,就要为字符串分配一次内存,效率显得有点低,这样的解释听起来很有道理,但 Cpython 解释器是不是真的按照我们说的这样呢? 今天做了一个试验,结果可能会出乎你的意料. defjoin(n): s = "".join((str(i) fori inrange(n))) defformat(n): ( "{}"

别不信!servlet获取到的参数值,也许完全出乎你的意料!

先贴出来简单得不能再简单的demo页面效果: 如下是spring mvc的Controller: @RequestMapping("mytest") @Controller public class ZhangTestController { private Logger log = LogManager.getLogger(); @RequestMapping(value = "toCancel") public String toCancel( HttpServ

第十七周oj刷题——Problem A: 实现复数类中的加运算符重载【C++运算符重载】

Description int家有i1和i2弟兄俩,小手一拉i1+i2,加起来了:double家有d1和d2姐妹俩,小手也一拉,d1+d2,也加起来了.C++村子里来了复数(Complex)一家子,也有俩兄弟c1和c2,想要来个累加,笨乎乎地,c1.add(c2).c1和c2伤心极了,也想像其他小朋友一样,小手一拉,c1+c2,也能加起来.这个任务交给了正在看题的魔术师,帮他们一个忙,让复数也能用+号相加吧.(可以复制提示部分的代码开始你的编程) Input 四个数,分别代表两个虚数c1和c2的

volley完全解析

一.volley是什么? 1.简介 ??Volley是Goole在2013年Google I/O大会上推出了一个新的网络通信框架,它是开源的.从名字由来和配图中无数急促的火箭可以看出 Volley 的特点:特别适合数据量小,通信频繁的网络操作.(个人认为 Android 应用中绝大多数的网络操作都属于这种类型). ??Volley加载图片实现了两级缓存(网络缓存.文件缓存),没有实现内存的缓存.Volley已经把各种异步任务.图片采样都封装好了.内存缓存使用lrucache类实现,需要我们手动添

Error #2044: 未处理的 IOErrorEvent:。 text=Error #2035: 找不到 URL这是flash加载外部资源时有时会遇到的问题,对于此问题解决如下

导致这个错误的主要原因是未添加IOErrorEvent事件监听,或者添加了监听,但是加载时使用了unload() 参考资料: http://blog.csdn.net/chjh0540237/article/details/9325797 添加IOErrorEvent事件监听,针对Loader和URLLoader添加方式有所不同 var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(IOErrorE

javascript中&amp;&amp;运算符和||运算符的使用

前言 我们在前端开发中,&&运算符和||运算符是使用率和频繁度比较高的,&&运算符和||运算符的功能特别强大,想成为一名优秀的前端工程师,&&运算符和||运算符是必不可少的,但是很多前端工程师(刚入门的小白[包括小编本身])对于&&运算符和||运算符的使用率极为低下,之前小编在学校开发一些项目的时候根本就没有用到过,因为我们已经被传统概念束缚了.我们对于&&运算符和||运算符的理解是这样的: &&运算符 &am

C++:运算符重载函数之&quot;++&quot;、&quot;--&quot;、&quot;[ ]&quot;的应用

5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++(X &ob) //友元函数重载,其中ob为类X的对象的引用 对于后缀方式++ob,可以用运算符函数重载为: ob.operator++(int) //成员函数重载 或 operator++(X &ob,int) //友元函数重载,其中ob为类X的对象的引用 调用时,参数int一般被传递给值0

C和C++运算符 (转)

这里是C和C++语言的运算符列表.所有列出的运算符皆含纳于C++:第三个栏目里的内容也使用C来描述.应当注意的是C不支持运算符重载. 下列运算符在两个语言中都是顺序点(运算符未重载时): &&.||.?: 和 ,(逗号运算符). C++也包含类型转换运算符const_cast.static_cast.dynamic_cast和reinterpret_cast,不在表中列出以维持简洁.类型转换运算符需要在表达式中明确使用括号,因此并不存在优先级的问题. 在C里有的运算符,除了逗号运算符和箭头