设为首页 加入收藏

TOP

浅谈C的应用与常见error(二)
2015-11-19 23:06:52 来源: 作者: 【 】 浏览:13
Tags:浅谈 应用 常见 error
给你添加了很多代码。
?
  包含了输入输出函数,所以在程序的调试阶段,他是不可少的。
?
  #include "gaozy" 这类头文件你见过么?它与#include 又有哪些区别呢?<>包含的头文件,编译器会在 系统目录中搜索。“”包含的头文件,编译器会先在当前工作目录中搜索,如果没有,再去系统目录中搜索。也可以简单的理解成C函数库里的函数在<>包含的头文件里,而我们自己写的函数则放在“”文件中。
?
?
?
  6、变量作用域
?
  int i;
?
  while (1)
?
  {
?
    int i = 0;
?
    printf("%d", i);
?
  }
?
  这样会报错么?当然不会,因为两个int i;并不在同一个作用域。
?
  那么什么是作用域,怎么分辨作用域呢?
?
  我们通常把一个{}内的代码看成在一个作用域。这也是为什么case里不可以定义变量的原因。
?
  只有{}才可以分辨作用域么?
?
  当然不是
?
  while (1)
?
    int i;
?
  printf("hellow world!");
?
  int i;自己单独在一个作用域中,printf()只会执行一次,当然这是一个死循环,不会执行到printf()。现在你有点略懂了么?跟while()相同的还有for(),if()
?
  还有个问题你想过么?第一次循环定义一个 i,第二次循环又定义一个 i,这不重复定义了么?
?
  当然不是,作用域内的变量是有生命周期的。也就是说,当第一次循环结束,你所定义的 i 的内存空间已经被释放。
?
  
?
  7、伤脑筋的bug
?
  你写过这样的程序么?
?
  int i;
?
  while (1)
?
  {
?
    int i = 0;
?
    printf("%d", i);
?
    int j;
?
  }
?
  编译器是这样报错的::\c\浅谈c.c(49) : error C2143: syntax error : missing ';' before 'type'
?
  我英文不好,不理解这句话是什么意思,但是这段代码里根本不存在缺少;的情况。
?
  我将代码粘到vs2010中,它是可以运行的。我一度怀疑是编译器出错了。但事实上编译器是很少出错的,纠结了很久,我突然想起来,c语言中规定,变量是必须在作用域的开始定义。vs210中,我用文件是后缀是.cpp的,就是是说c++允许在其他函数之后定义变量,而c对此则表示不支持。
?
?
?
  你写的代码有没有之前运行正常,你只是修改了一点,语法上别没有出错。但编译器却报错了呢?
?
  LINK : fatal error LNK1168: cannot open Debug/SMIS.exe for writing
?
  之前遇见这个问题也是纠结很久,为什么一会儿可以编译,一会儿又让我等待呢?
?
  这也不是编译器出错了。而是你执行了程序,没有关闭,对代码进行了修改,又要执行程序。
?
  编译器如果会说话:“小子,你拿我开心呢吧,还能不能一起玩耍了。”
?
?
?
  当你malloc时,要记得free啊,还有malloc之后跟上一个判断是有必要的。
?
  p_head = (P_STUDENT)malloc(sizeof(STUDENT));
? ? ?if (NULL == p_head)
? ? ?{
? ? ? ? ?printf("动态内存分配失败,程序结束!");
? ? ? ? ?exit(-1);
? ? ?}
?
  如果没有if()判断的话,在内存分配失败时,运行程序会出错,而且很难找到错误原因。
?
?
?
  8、字符串,数组,指针
?
  谈到字符串、数组、指针,那么我们就不得不谈内存了。我们可以把内存理解成一排很长很长的房子,它是一个线性结构。房子里住着不同的人家,每个房子有不同编号。
?
人家对应的是计算机里定义的变量,房子编号对应的是变量所在地址。所以,我们每定义一个变量,都会占用一套房子,当房子被全部占用时,你的电脑就崩溃了。当然,我们电脑的内存还是很大的。下面来看看字符串、数组、指针之间的关系。
?
  字符串以“/0”结束,所以字符串长度要在实际长度上+1
?
  数组名就是数组首元素的地址
?
  char ch[10] = "asdfg";  //ch[10]是定长数组
?
  char ch[] = "asdfg";  //ch[]没有规定长度,但是在定义时必须初始化
?
  char *p_ch = "asdfg";  //指针指向字符串的首地址
?
  这三种定义字符串的方法差不多。ch和p_ch都是地址。
?
  数组定义之后不可改变,指针还可以指向其他地址,但要注意内存泄露。
?
  
?
  9、指针与地址
?
  有些书上说指针就是地址,其实这种说法并不准确。
?
  那么指针是什么,地址又是什么?
?
  首先地址就是地址,物理内存的编号。
?
  指针是一个变量,这个变量存放的内容是内存的物理地址。就像int i; i 是一个变量,存放一个 i 值。指针变量也存放一个指针值,这个值是一块物理内存的地址。
?
  其实指针是地址还是变量并不影响我们对指针的使用。
?
?
?
  10、你用过宏么?
?
  #define MAX 60
?
  就是MAX = 60;的意思,之后的代码中MAX都等于60。宏使我们的程序维护更简单,也更容易理解。
?
?
?
  11、malloc与free
?
  有人说new跟delete更强大,但我并这么认为,new和delete是c++中的运算符,提供了对对象的操作。而malloc和free是c语言中用来进行动态内存分配的,不具备可比性。
C语言是面向过程的程序设计,根本没有对象的概念。
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C编译器剖析-汇编代码生成寄存器.. 下一篇Object-C学习札记 NSString常用方..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: