易截截图软件、单文件、免安装、纯绿色、仅160KB

谈C中scanf陷阱

原文地址:http://westsoftware.blog.163.com/blog/static/2609410920091953456841/
      最近一直在看Andrew Koening写的书籍,可以说学习C/C++或者从事这方面的开发的人员非常值得一看的书籍,这里我推荐看看《C陷阱与缺陷》与《C/C++沉思录》。
      这里先来看看《C陷阱与缺陷》一段代码。
#include <stdio.h>
int main()
{
int i;
char c;
//printf("i address:%ld\n",&i);
//printf("c address:%ld\n",&c);
for(i=0 ; i<5; i++)
{
scanf("%d",&c);
printf("%d ",i);
}
return 0;
}

这么精小的一段代码,看看运行结果将会是什么?请看清楚C是字符变量。
刚开始的时候,对他讲的东西不是很明白,为了更加清楚,分析相关内存结构。
由于scanf指向的是一个整形指针,此时C接收字符录入,所以在给C输入数据的数据的时候,会将i的一些内存地址进行覆盖,怎么覆盖的呢?在FC6下,会将i的低端地址覆盖成C的高端地址,不知道这么说能不能明白?就是说C实际接收了一个整形变量,但是C存不下,多出的那部分怎么办呢?就将C的高端地址位覆盖成I的低端地址位了,所以I的值一直都是0,所以在运行此程序是一个死循环状态。
上面注释掉那两段,可以打印看看C与I的地址。我这里打印的地址是连续的。
但是在VC6中,是可以正常运行的,这就是我说的内存地址覆盖方式不一样,换句话说,怎么覆盖是有编译器决定,这里我是这么猜想,VC覆盖内存的时候是C的左彻的那段内存而不覆盖I的内存地址,所以在VC中能正常。
这也是一个猜想,怠于证实。而在FC中是“往右”进行覆盖。
所以开发的时候,一定要注意,这种陷阱一旦走进去的,就很难调试,有时候也有一种“凑巧”来避开这个问题,差错就更加不好查。希望在以后开发的时候能给大家有一定的参考。


相关文档:

c宏定义的技巧总结


1,防止一个头文件被重复包含
#ifndef COMDEF_H
#define COMDEF_H
//头文件内容
#endif
2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
typedef unsigned char      boolean;     /* Boolean value type. */
typedef ......

一道c的面试题,大数相乘

 http://www.cnblogs.com/hoodlum1980/archive/2007/08/15/857067.html
题干:输入两个较大的数,输出相乘的结果。
意思也就是两个数很大,超出了int的存储范围。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100
void GetDigits( ......

C/C++语言中Static的作用详述

在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。
(1)先来介绍它的第一条也是最重要的一条:隐藏。
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。
下面是a.c的内容
ch ......

《编程珠玑》问题的C实现——2:向量旋转

 #include <stdio.h>
#include <stdlib.h>
#define SIZE 17
void reverse(int start, int end);
int data[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};
int main(void)
{
int i = 5;
reverse(0, i - 1);
reverse(i, SIZE-1);
reverse(0, SIZE-1);
return ......

ASA局域网C/S架构配置最终完美超强版............


ASA局域网C/S架构配置最终完美超强版............
具体实现有两种,如下:
一、服务器端安装ASA,因为要使用ASA中自带的Sybase Central工具。
服务器端开启:scjview.exe(即:Sybase Central,注意不是Sybase Central-Sybase Central。界面如图:)
1、设置如下:file-new-server
服务器名字随便起(便于这个工具 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号