1. 变长数组(Arrays of Variable Length)或者(variable-length array,VLA)
c99标准的一个特性。c89的一个扩展(对gcc来说)
变长数组和变量都分配在栈上,普通变量的内存分配是按照定义顺序, 先定义的先分配, 但是变长数组不同,它是在最后分配的, 因此总在栈的最下面。变长数组在效率上比在堆上malloc/free好一点,它不需要显式回收,因此不会引起内存泄漏。(The storage is allocated at the point of declaration and deallocated when the brace-level is exited)
变长数组需要编译器的支持,gcc对
变长数组(Arrays of Variable Length)有支持。
对变长数组进行sizeof操作得到的是真正的数组大小。
2. 灵活数组域(flexible array member)
c99标准的一个特性,使得可以声明一种特殊的结构,这种结构中的数组是可变长度的,我是在redis的源代码中第一次见到:
struct sdshdr {
int len;
long free;
char buf[];
};
char *aName = "Michel Jackson";
struct sdshdr *nm = malloc(sizeof(*nm) + strlen(aName) + 1);
strcpy(nm->buf, aName);
。。。
也就是说,最后一个指针成员变量所指向的数组空间是变长的。
sizeof计算结构体的大小时,不会计算变长数组的大小,因此上面的结构体实际上是len和free两个成员组成的结构体大小。
灵活数组域规定,可变数组成员变量必须在结构体的最后声明。
灵活数组域的一个优点是不用两次分配内存,也就减少了内存碎片。(不然的话,nm初始化分配一次,buf分配一次,free也要两次,麻烦又容易出错)同时施放内存也不用两次释放,一次搞定。
3. 给结构体分配内存的方法
对于结构体,最后这样分配内存
struct T *p = malloc(sizeof *p);
而不是
struct T *p = malloc(sizeof (struct T));
这样对所有类型的指针(除了void类型)都可以完成分配,
这种方式的好处是:如果p的类型换成另外一种结构了,malloc的地方不用修改。
在《C语言接口与实现》第5章看到的这个技巧。
4. NULL 指针的问题
char *str = NULL
strlen(str); // 会出现bus error
不过sizeof(str)还是正确的,即使str是NULL,这也说明sizeof是根据类型计算大小的。
5. 关于void
不同类型的指针间引用的转换
int i = 7;
void *p = &i;
printf("i = %d\n", * ((int *)p); // 先把void指针转化成int指针,然后对转化的指针解引用操作
有void类型的指针变量,而没有void类型的一般变量
如果函数无返回指,应该指定返回类型是void的,不指定的话缺省返回的是int
5. 关于size_t
malloc等函数中分配内存大小的参数是size_t类型的,这是一个无符号的整数类型,但是有符合的整数也能传递,编译时不会给出警告:
int n = -1;
p = malloc(n);
打印size_t数据:
size_t sz = 999;
printf("size: %zu\n", sz);
6. 数组指针
数组指针是一种指针,这个指针指向一个数组。
#include <stdio.h>
typedef int (*x)[10] ;
int main() {
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
int (*p2)[10];
p2 = &arr;
x p3 = &arr;
printf("ptr sz: %zu, %zu\n", sizeof(p2), sizeof(p3));
printf("arr ptr sz: %zu, %zu, %zu\n", sizeof(arr), sizeof(*p2), sizeof(*p3));
printf(" arr = %p, &arr = %p\n", arr, &arr);
printf("p2+1 = %p, p3+1 = %p\n\n", p2+1, p3+1);
for(int i=0; i<10; ++i) {
printf("%d, %d, %d; ", arr[i], (*p2)[i], (*p3)[i]);
}
printf("\n");
return 0;
}
注意数组arr的指和&arr的值相同,但含义不同,至少类型不同。
(to be continue)
分享到:
相关推荐
在深入探讨C++学习过程中的琐碎点与注意点时,我们首先应当明确,C++是一种功能强大且灵活的编程语言,它结合了C语言的高效性和面向对象编程的特性,广泛应用于系统软件、游戏开发、高性能计算等领域。然而,正是...
最后,对于C语言的深入学习,不要过于纠结于琐碎的细节,如某些特定的运算符用法。重点在于掌握流程控制语句、数组、函数、指针等基础知识的应用,因为它们是理解和使用C语言的核心。只有扎实的基础,才能为后续学习...
在MCU开发中,头文件(.h)通常包含函数声明、常量定义和结构体等信息,而源文件(.c)则包含具体的函数实现和逻辑代码。该工具能够自动生成这两类文件,确保了代码的一致性和规范性。开发者只需要按照既定的编程...
不必一开始就追求全面,避免陷入琐碎细节。 2. **实践至上**:编程是实践性极强的学科,理论知识与实践操作必须相结合。大量编写代码是提高编程技能的唯一途径。记住,程序是“写”出来的,不是“看”出来的。动手...
5. **细节添加脚本**:用于为模型添加纹理、细节和凹凸感,如快速雕刻、添加随机噪点等,这些脚本可以让模型看起来更加真实和细腻。 6. **动画和模拟脚本**:对于需要动态效果的项目,如物体运动、粒子系统等,工具...
10. 自动化工具:为了简化日常工作,项目可能集成了一些自动化工具,如持续集成/持续部署(CI/CD)工具Jenkins或GitHub Actions。 由于具体的代码内容没有给出,以上只是基于标题和描述的合理猜测。要深入了解这个...
在Java编程语言中,有多个重要的知识点涉及到类的属性、...这些琐碎的Java知识点构成了Java语言的基础,理解和掌握它们对于编写高效、可靠的代码至关重要。在实际编程中,这些细节往往能决定程序的正确性和可维护性。
有限状态机(Finite State Machine, ...通过 Awk 脚本解析 FSM 规范,自动生成相应的C代码,使得开发人员可以专注于业务逻辑,而不是琐碎的状态转换细节。对于任何涉及状态驱动设计的C项目,这都是一个有价值的工具。
2. 修正了一些琐碎的笔误,同时增添了些琐碎内容 3. 修正了 0xdeadbeef 的解释 4. 更新了所有的 xml:id 修订 1.6 2011-05-01 crl 1. 添加汇编学习记录 2. 添加了如何查看 C 或汇编的源代码所对应的真正的汇编代码 3....
"Obitum: Android Capstone 2014年10月电影琐碎应用程序"是一个基于Android平台的项目,旨在帮助用户管理和跟踪他们喜欢的电影信息。这个项目的名称可能源于拉丁语“obitum”,意为死亡或丧葬,但在这里可能是象征性...
标题中的“版本:[基本功能完整]琐碎但功能齐全的天气预报”表明这是一个关于天气预报的应用或软件,它可能包含一系列与气象信息查询、显示和分析相关的功能,且已经完成了基础功能的开发,能够满足用户的基本需求。...
第一个空需要填入一个动词,描述“主线”被“琐碎记载”影响的程度,这里“遮蔽”更合适,因为它能准确描述主线被琐碎细节覆盖的情况。第二个空需要填入一个形容词,描述细节的优点,“精妙”能够突出细节处理的巧妙...
sudoku.c很可能是一个实现数独解决方案的C语言程序,涉及递归、回溯算法或搜索策略。expr.c可能是解析或计算数学表达式的代码,可能涉及到编译原理、词法分析和语法解析。Trans文件名较模糊,可能是转换工具,用于...
1. 面向对象的代码:Swarm 库由名为“Objective-C”的计算机语言编写而成,这种语言是 C语言的超集。Objective-C 提供了创建软件“类”的能力,进而可以创建实例个体,实例是自包含的实体。 2. 层次结构的程序:大...
标题中的“Netbeans对Codeigniter框架支持的插件”是指NetBeans IDE...通过安装和利用这些插件,你可以更加专注于你的项目,而不是被琐碎的代码细节所困扰。同时,保持插件更新以获取最新的特性和改进也是十分重要的。
MFC提供了丰富的控件和框架支持,使得开发者可以快速构建出美观、易用的界面,而无需深入底层WinAPI的复杂细节。在这个学生信息管理系统中,MFC起到了核心支撑作用,它使得开发者可以专注于业务逻辑的实现,而不是...
综上所述,玲珑GUI是一款面向未来的技术,它将界面开发带入了一个新的时代,让开发者能够更专注于创新和用户体验,而不是被琐碎的编程细节所束缚。无论是桌面应用还是物联网设备,玲珑GUI都能提供强大的支持,推动...
wxWidgets是一个跨平台的GUI库,它允许开发者使用C++创建原生的桌面应用程序,且无需关心底层操作系统细节。 5. **动态链接库文件**: 压缩包中的`.dll`文件(如`codeblocks.dll`、`wxsmithlib.dll`、`wxscintilla...