
怎样学好C语言
文章平均质量分 76
半醒半醉日复日,花落花开年复年
这个作者很懒,什么都没留下…
展开
-
【C语言】sizeof(数组名),包括 一维数组、字符数组、二维数组
sizeof(a);sizeof(a+0);sizeof(*a);sizeof(a+1);sizeof(a[1]);sizeof(&a);sizeof(*&a);sizeof(&a+1);sizeof(&a[0]);sizeof(&a[0]+1)原创 2022-05-13 19:46:59 · 24455 阅读 · 1 评论 -
【C语言】printf函数参数压栈问题
现在我们假设参数的压栈顺序是从左到右的,这时,函数调用的时候,format最先进栈,之后是各个参数进栈,最后pc进栈,此时,由于format先进栈了,上面压着未知个数的参数,想要知道参数的个数,必须找到format,而要找到format,必须要知道参数的个数,这样就陷入了一个无法求解的死循环了。而如果把参数从右到左压栈,函数调用时,先把若干个参数都压入栈中,再压format,最后压pc,这样一来,栈顶指针加2便找到了format,通过format中的%占位符,取得后面参数的个数,从而正确取得所有参数。原创 2022-05-07 16:23:47 · 1431 阅读 · 0 评论 -
【C语言】C语言的基础知识以及基础试题(对基本知识点的掌握)
int a[10]:声明了一个有10个int类型元素的数组, 数组下标从0~9, 所以a是数组名, 代表数组的首地址, 也就是&a[0], sizeof(a)返回数组a在内存中所占的空间大小,以字节为单位, 也就是sizeof(a) = sizeof(int) * 10 = 4 * 10 = 40bytes。变量与指针的关系如图1所示;调用GetMemory( str )后, str并未产生变化,依然是NULL.只是改变的str的一个拷贝的内存的变化,getmemory中的malloc 不能返回。原创 2022-05-04 14:13:49 · 1760 阅读 · 0 评论 -
【C语言】string.h中str函数源码实现解析(strlen、strcpy、strncpy、strcat、strcmp、strstr、memcpy、memmove)
strlen函数原型:size_t strlen(const char *str);strlen返回str中字符的个数,其中str为一个以’\0’结尾的字符串(a null-terminated string)。strlen源码简单实现如果不管效率,最简单的实现只需要4行代码:size_t strlen_a(const char * str) { assert(str != NULL); //检查指针的有效性 size_t length = 0 ; while (*st原创 2022-03-10 16:02:44 · 3913 阅读 · 0 评论 -
【C语言】5. 指针free后为什么要刻意指向NULL、野指针(原因、解决)、悬垂指针
指向非法的内存地址指针叫作野指针。野指针是很危险的,因为if无法判断一个指针是正常指针还是“野指针”。指向曾经存在的对象,但该对象已经不再存在了,此类指针称为垂悬指针。原创 2022-01-26 19:05:31 · 10711 阅读 · 0 评论 -
【C语言】4. 动态内存管理(malloc、realloc、calloc 以及 malloc底层实现)
这样做的最大好处就是,使用户申请和释放内存的时候更加高效,避免产生过多的内存碎片。为了减少内存碎片和系统调用的开销,malloc其采用内存池的方式,先申请大块内存作为堆区,然后将堆区分为多个内存块,以块作为内存管理的基本单位。有时会我们发现之前申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,我们一定会对内存的大小做灵活的调整。情况2:原有空间之后没有足够大的空间,在堆空间上另找一个合适大小的连续空间来使用,并把原有内存中的数据移过去,这样函数返回的是一个新的内存地址。原创 2022-01-25 12:47:59 · 1214 阅读 · 0 评论 -
【C语言】3. #pragma once 与 #ifndef的区别
ifndef方式是C/C++语言的标准支持,也是比较常用的方式,#ifndef的方式依赖于自定义的宏名(例中的__SOMEFILE_H__)不能冲突,它不光可以保证同一份文件不会被包含两次,也能够保证不同文件完全相同的内容不会被包含两次。此外,由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,#ifndef会使得编译时间相对较长,因此一些编译器逐渐开始支持#pragma once的方式(Visual Studio 2017新建头文件会自带#pragma once指令)。原创 2022-01-23 23:02:40 · 289 阅读 · 0 评论 -
【C语言】2. assert()断言函数
(3)不能使用改变环境的语句,因为assert只在Debug 生效,如果这么做,会使用程序在真正运行时遇到问题。如果表达式的结果为“假/0”,assert() 会打印出断言失败的信息,并调用 abort() 函数终止程序的执行;assert 宏的原型定义在 assert.h 中,其作用是如果它的条件返回错误,则终止程序执行。使用 assert 的缺点是:频繁的调用会极大的影响程序的性能,增加额外的开销。如果表达式的结果为“真”,assert() 就什么也不做,程序继续往后执行。原创 2022-01-22 22:36:06 · 1837 阅读 · 0 评论 -
【C语言】1. 结构体struct(结构体概念、结构体指针、结构体作为函数参数、传值与传地址、内存对齐(struct与union))
/创建结构体模板 struct Student {int _age;//使用该模板创建3个变量stu1,stu2,stu3 struct Student stu1 , stu2 , stu3;缺点就是定义变量时必须带上struct可以使用typedef进行简写,这样在定义变量时比较简洁//结构体模板struct Student重新命名为Stu typedef struct Student {int _age;} Stu;原创 2021-11-27 13:03:30 · 12418 阅读 · 1 评论