随笔分类 - c
c的一些语法理解
摘要:一、概述 1.是声明一个长声明的缩写 typedef是声明一个同义字,所以: typedef unsigned int U4; U4 foo = 512; 等价于: unsigned int foo = 512; 2.是预处理指令 因为是预处理指令,所以在小标签被定义之前typedef也是被允许的:
阅读全文
摘要:一、概述 在偶然一次尝试使用unix函数mkdtemp的时候发现一个问题,函数有一个唯一参数template是一个字符串指针,它的声明如下: char *mkdtemp(char *template); 当我声明一个指针形式的字符串指针,并传入mkdtemp的时候,出现了Segmentation f
阅读全文
摘要:1.用typedef声明一个短语代替冗长的struct成员声明 int main(void) { typedef struct Hores Hores; struct Hores { int age; int height; char name[20]; char father[20]; char
阅读全文
摘要:表达式结合规律 如果运算符具有相同的优先级(precedence)有些表达式的结合方式是从左往右,有些则是从右往左结合的(例如赋值运算符): 表达式 结合律 组合方式 a/b%c 从左往右 (a/b)%c a=b=c 从右往左 a=(b=c) 运算符优先级 优先级 运算符分类 标识符位置 运算符 表
阅读全文
摘要:概述 副作用: 《C语言核心技术》对副作用的描述: 表达式内包含了一串的常量、标识符、运算符(指示的运算方式)。表达式的目的可以是获得结果值,或者得到运算的副作用(side effect),或者两者兼备。 获得结果值是比较容易理解的一句话术,比如下列这些表达式: x + 1; x + y; d(e)
阅读全文
摘要:链接和生存周期的区别: 链接是标识符的属性; 生存周期是对象的属性; 链接可以是外部(external),内部(internal)或没有(none); 生存周期可以是自动的、静态的,或已分配的(allocated); 链接: 一个被声明在多个翻译单元内的标识符,或者在同一个翻译单元内被声明多次的标识
阅读全文
摘要:一、概述 左值是一个很让人困惑的概念,通常一条赋值表达式,例如x = y; 左边的操作数一定要是一个左值才能够被赋值,否则编译器就会报错: error: lvalue required as left operand of assignment 要搞清楚左值的含义,首先要理解C语言的“对象”这一概念
阅读全文
摘要:一、预处理指令在编译阶段就处理了,所以编译成才后运行的这个阶段已经是预处理后的结果,例如指令 的预处理方式是把代码出现有BUFFSIZE的地方都替换为4096; 下面的例子,test会正确打印BUFFSIZE,跟作用域无关: 反而跟编译顺序有关,把BUFFSIZE定义放在定义test的行数之下,编译
阅读全文
摘要:概述 对于刚接触C语言的同学来说,通常对“在文件中用#include预处理操作符引入文件”和“编译时链接多个文件”这两个操作会有所混淆,这个文章主要为了解析一下它们的区别。 #include预处理操作符 对于此类操作,你可以在C语言预处理机制上去理解,预处理,顾名思义是编辑器在编译前进行的一系列操作
阅读全文
摘要:1概述 如果使用char[]来声明char数组,那么编译器会自动计算后面的字面量字符数,再加上一个空字符,作为它的长度。实际上这个数组最后一位被编译器强行加上了\0: #include <stdio.h> #include <unistd.h> #include <fcntl.h> #define
阅读全文
摘要:概述 C语言作用域有点类似于链式结构,就是下层能访问上层声明的变量,但是上层则不能访问下层声明的变量; 就像上述例子,第二个if语句块是可以访问到第一个if语句块中声明的变量x的; C语言一般把变量作用域归结为4个: 1.文件作用域; 2.语句块作用域(所有大括号的语句块,如if/for/while
阅读全文
摘要:概述 \x转义的定义是这样的 问题 看似\x后面可以接受1或n个十六进制的字符,但是如果你把一个超过ff分十六进制数赋值给一个char变量,会得到一个"Out of range"的提示; 分析 这是因为char类型只能容纳1byte的数,面对十六进制123是无能为力的,但是,即使是把char类型换成
阅读全文
摘要:问题 在有一次尝试用stat()函数获取文件属性的时候,发现如果直接声明一个指针,然后把这个指针作为参数传给函数,会导致函数执行失败,原代码: 原因 我猜测是因为声明指针并不代表在正文创建了这个变量,实际上它只是一个属于这个类型的指针,并不指向任何变量。所以,但凡用指针传入函数赋值的情况,必须在程序
阅读全文
摘要:问题 我曾经很困惑,就是在两个编译单元当中,如何把一个单元中声明的struct结构引入到另外一个单元中来,折腾了很久,后来发现这位大神的留言 我顿时发现自己是有多么的傻x. 说白了extern面向结构的语法,只针对对象的本身,而不包括结构,结构只是一个模板,是写给编译器看得。并不存在extern结构
阅读全文
摘要:Static翻译出来是“静态”“静止”的意思,在C语言中的意思其实和它的本意差不多,表示“静态”或者“全局”的意思,用来修饰变量和函数。经static修饰过后的变量或者函数的作用域或者存储域会发生变化,而由static修饰的变量在初始值方面也会表现出static关键字的优势。想知道经static修饰
阅读全文
摘要:一、extern 概述 编译器是由上至下编译源文件的,当遇到一些函数引用外部全局变量,而这个变量被定义在该函数声明主体的下方,又或者引用自其它的编译单元,这个情况就需要extern来向编译器表明此变量是一个外部变量 问题1.运用extern实现全局变量声明提升效果 上述代码,全局变量v被声明在函数f
阅读全文
摘要:简单的GCC语法: 如果你只有一个文件(或者只有几个文件),那么就可以不写Makefile文件(当然有Makefile更加方便),用gcc直接编译就行了。在这里我们只介绍几个我经常用的几个参数,第一是 “-o”,它后面的参数表示要输出的目标文件,再一个是 “-c”,表示仅编译(Compile),不连
阅读全文
摘要:一、概述 运用标准C的头文件stdarg.h提供的宏可以实现函数的自定义传参个数; 二、语法 1.va_list是一个可变长参数类型,在使用可变长参数的函数中可以定义1个或多个va_list类型参数,等待va_start初始化后使用; 2.va_start作用是给va_list类型变量绑定一个起始值
阅读全文
摘要:原文地址:https://www.cnblogs.com/youthshouting/p/4280543.html,转载请注明源地址。 1.内存分配区间: 对于一个C语言程序而言,内存空间主要由五个部分组成:代码段(.text)、数据段(.data)、静态区(.BSS)、堆和栈组成。 BSS段:BS
阅读全文
摘要:引言 原文地址:http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html,转载请注明源地址。 对于任何使用C语言的人,如果问他们C语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏。这些的确是消耗了开发人员大多数调试时间的事项
阅读全文

浙公网安备 33010602011771号