C语言
学习C语言之路,永不止息
求生之路231
没有技术就没有尊严
展开
-
如何用man查看头文件内容
sudo apt install manpages-posix-dev原创 2022-04-03 09:30:34 · 434 阅读 · 0 评论 -
C语言学习-多用typedef代表复杂结构
在看Linux 进线程编程时顺便学习信号量,结果看到这个的时候懵了一下:这里我开始以为将 void 起了个别名叫 (*sighandler_t)(int),看了大神davidsky11的 文章恍然大悟, 它定义了一个类型sighandler_t,表示指向返回值为void型(参数为int型)的函数(的)指针。它可以用来声明一个或多个函数指针。 sighandler_t sig1, sig2; 这个声明等价于下面这种晦涩难懂的写法: void (*sig1).原创 2020-09-16 00:21:25 · 121 阅读 · 0 评论 -
C语言学习-标准IO-fgets/fputs
char *fgets(char *s, int size, FILE *stream);fgets函数功能:fgets()最多从 stream 中读取小于 (size-1) 个字符,并将其存储到s指向的缓冲区(字符数组)中。stream:可以是标准输入,文件size:读取的字符长度返回值:读取成功则返回指向字符数组首个元素的指针,当发生错误或者已经读到文件末尾返回 EOF判断条件:即判断返回值是否等于NULL即可int fputs(const char *s, F...原创 2020-09-14 23:07:20 · 136 阅读 · 0 评论 -
获取Linux gcc结构体成员类型的方法
对于struct stat 结构体,我想打印输出成员变量,利用 man 手册查到的成员是这样的没有类型名字,也不给示例。从网上搜罗出几种判断数据的类型的方法如下:1、gdb工具中的ptype/whatis命令利用gdb工具中的ptype命令可以找到部分类型的原始类型whwhatis可以判断在该成员的自定义类型名像这样,但是也有成员类型名查不出来的,是什么原因暂未查明,如有大佬知道请告知。明明存在的,下面再使用下面的方法2、用 grep 命令查找原结构体声明,查到.原创 2020-09-14 10:32:44 · 395 阅读 · 0 评论 -
C语言学习-类型限定符
百度解释:restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样指向这个内存单元的其他指针都是未定义的,直白点就是无效指针。restrict 的出现是因为 C 语原创 2020-09-14 09:10:24 · 124 阅读 · 0 评论 -
GCC编译器结构体默认字节对齐方式
当然变量起始地址是自身所占字节数的整数倍,是默认情况下字节对齐的前提。1、理想情况下,都是按照自身所占字节数进行对齐,此时结构体此时所占空间最大。2、所占字节小的变量所占空间会被下一个所占字节大的变量影响,具体影响有如下几种。小变量所占空间和大变量所占空间相同 前面的小字节变量所占空间和等于下个大字节变量,那么所占空间不边。 3、最大字节对齐量为 4字节总结:gcc编译器和VC编译器的字节对齐方式有些许差别,总的来说VC字节对齐要大一些,而GCC字节对齐方式比较省空间。.原创 2020-09-03 18:53:43 · 2220 阅读 · 0 评论 -
关键字(extern/static)与标识符的三个属性(链接属性、作用域、存储类别)
链接属性:全局变量和局部变量全局变量定义在函数体外的变量为全局变量。全局变量分为静态全局变量和外部全局变量无特别说明,则全局变量默认为外部全局变量,即可以被定义的源文件外的文件调用作用域静态全局变量: 定义如下一般变量被定义源文件全局可用,且不能被除定义该变量/函数的外部源文件使用。一般变量static int a = 10; //定义一般函数static int add(int a, int b);外部全局变量:原创 2020-09-03 16:33:02 · 255 阅读 · 0 评论 -
计算整数中1的个数
1 #include <stdio.h> 2 3 int main(int argc, char **argv) 4 { 5 int x; 6 printf("请输入想计算的整数:"); 7 scanf("%d", &x); 8 9 printf("%d中 1 的个数为%d\n", x, Count(x)); 10 11 12 return 0; 13 } 14 15 int Count(int x)..原创 2020-08-28 15:52:46 · 306 阅读 · 0 评论 -
测试C语言主函数的返回值
C语言主函数的返回值主要分为 return 0; return 1三种形式分别为正常结束,非正常结束;下面用代码来测试一下int main(int argc, char **argv){ printf("My name is DWL\n"); return 0;}这里如果./a.out 如果返回值为真,那么 && 后面的语句才能执行。倘若改为 return 1;两个做对比我们可以看到结果,这里的返回值被编译器接收到了,并原创 2020-08-25 15:53:31 · 617 阅读 · 0 评论 -
汇编语言学习【2】-程序
一个简单的程序一个源程序从写出到执行的过程程序 包含汇编指令和伪指令汇编指令:组成由计算机执行的程序1、伪指令:由编译器来处理(1)、代码段名 segment…… 代码段名 ends定义代码段(2)、end 汇编程序的结束标志(3)、assume 假设,将段名和段寄存器关联assume cs:codesg 段名:c...原创 2020-02-10 01:09:02 · 131 阅读 · 0 评论 -
C语言学习【23】-结构体
#include <stdio.h>struct Student { int age; float score; char sex;}; //这里就相当于建立一个名字叫做struct Student的数据类型 用这个数据类型可以定义变量 int main(void){ str...原创 2020-02-09 18:35:02 · 165 阅读 · 0 评论 -
汇编语言学习【1】-寄存器
寄存器:CPU内能够存储数据的器件AX,BX,CX,DX,为什么要分高字节和低字节?因为8086要向上向上兼容80386,80386是 8 位机。程序运行CS:CPU要运行的程序的段地址IP:CPU要运行的程序的偏移地址CS:IP共同指向程序的首地址数据的内存空间 DS : 保存要操作的数据的段地址【addres...原创 2020-02-09 11:44:30 · 804 阅读 · 0 评论 -
C语言学习【22】-枚举
枚举什么是枚举枚举就是把一个事物的所有取值都一一列举出来。输出结果为:enum WeekDay是一个数据类型,和结构体一样。而且day可以用整形输出,其大小为元素在枚举中的位置枚举的优点看起来更直观经常和switch函数搭配使用...原创 2020-02-08 23:01:09 · 76 阅读 · 0 评论 -
C语言学习【21】-排序
冒泡排序看了一张动图自己就写出了来了步骤:1、从第一个(0)到倒数第一个(len-1)两两比较,最后得出最大值2、从第一个(0)到倒数第二个(len-2)两两比较,最后得出这个范围内的最大值3、以此类推……输出结果为:还有诸如选择排序等排序方法请参考https://www.cnblogs.com/onepixel/p/7674659.html...原创 2020-02-08 22:34:30 · 153 阅读 · 0 评论 -
C语言学习【20】-动态变量跨函数调用
啥也不说了上代码输出结果为:这里为什么要用二维指针?因为一个函数调用完成后,就会出栈,该函数所占的内存就会释放掉,所以我们用一维指针 p 指向该内存的话在该内存释放后就不能访问该内存了,那么我们就需要在建立一个动态内存来将该内存的值在还没有释放掉的时候保存它。这时我们就用到了一个malloc函数,我们知道malloc函数返回值是一个地址,我们需要使指针变量 p 指向这个地址。对...原创 2020-02-08 18:36:13 · 533 阅读 · 0 评论 -
C语言学习【19】-静态变量跨函数调用【我懵逼了,谁能给我讲讲】
直接上代码输出结果为:懵逼的原因:背景为静态变量当然是不能跨函数调用的啊,因为静态变量的内存在函数执行完就释放了啊,除非这个变量在主函数内。那么再看上面的程序f 函数形参为二重指针,这里将 指针变量 p 的地址发送给该函数,然后将 f 函数中的整形变量 i 的地址赋给了 p ,f 函数调用完成后,i 的内存空间也给释放掉了,但是输出 *p 依然能够输出,我很疑惑。带...原创 2020-02-08 17:26:39 · 1698 阅读 · 5 评论 -
C语言学习【18】-动态内存分配(malloc函数)以及free以后的问题
传统数组的缺点:1、数组长度必须事先制定,且只能是常整数,不能是变量;eg:int a[5] ;//OKint len = 5; int a[len]; //Error2、传统形式定义的数组,在函数运行期间该数组的内存程序员无法手动释放(只能系统释放),系统为该函数中数组所分配的空间会一直存在,直到数组所在函数运行完毕时,数组的空间才会被系统释放。3、数组的长度一旦定义...原创 2020-02-07 23:02:56 · 419 阅读 · 0 评论 -
C语言学习【17】-指针长度和如何表示变量的地址
指针所占字节就是地址总线的宽度(和其数据类型无关)如果地址总线的宽度是32bit,那么指针所占字节为4字节(4B)如果地址总线的宽度是64bit,那么指针所占字节为8字节(8B)输出结果为:对于指针如果表示一个数据类型的变量的地址?一般指针指向的是该数据类型变量所占内存的首字节单元地址那为什么指针指向的是变量所占内存首地址,而通过指针可以输出变量的值?因为指针的数据类...原创 2020-02-07 21:18:13 · 792 阅读 · 0 评论 -
如何提高centos7 的swap内存空间
这篇文章介绍的很详细:https://www.vembu.com/blog/increase-swap-memory-centos-7/原创 2020-02-07 01:35:24 · 428 阅读 · 0 评论 -
C语言学习【16】-指针学习-互换两个数字&&形参和实参
输出结果是:所以形参的改变不会影响实参的任何改变形参和实参形参(形式参数)在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。实参(实际参数)函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。形参和实参的功能是传递数据,发生函数调用时,实参的值会传...原创 2020-02-06 20:56:10 · 366 阅读 · 0 评论 -
c语言学习【15】-指针常见问题
野指针这样编译的话编译器一般不报错我们编程主要是跟内存打交道这个p存储的是一个垃圾值(因为没有初始化),则我们不知道这个值如果作为地址的话指向的哪个地址,所以也就不知道那个地址中存储的值是什么,属于谁,然后强行对这个不属于自己控制的内存进行操作(对这个空间强行赋值),如果这个内存单元属于别的软件或者系统的话,就可能导致软件崩溃或者系统崩溃。如果我们定义了一个野指针 p...原创 2020-02-06 19:24:25 · 124 阅读 · 0 评论 -
C语言学习【14】-指针概念2
指针用来干什么?指针可以用来表示一些复杂的数据结构,而数组表示同一类关系的数值,而无法表示一些复杂关系,比如说树,图;快速的传递数据;使返回一个以上的值;可以直接访问硬件;能够方便的处理字符串;是理解面向对象语言中“引用”的基础;总结:指针是C语言中的灵魂指针的定义地址: 内存单元的编号 从零开始的非负整数 ...原创 2020-02-06 19:01:40 · 117 阅读 · 0 评论 -
C语言学习【13】-指针概念1
#include <stdio.h>int main(void){ int *p; //p是变量的名字,int *表示p变量存放的是int类型变量的地址 //int * p 不是表示定义了一个名字叫做 *p的变量 //int * p 应该这样理解:p是变量名,p变量的数据类型是int * //所...原创 2020-02-06 17:52:32 · 211 阅读 · 0 评论 -
C语言学习【12】-全局变量和局部变量
全局变量在所有函数外部定义的变量叫全局变量在全局变量外使用范围:从定义位置开始到整个程序结束局部变量在一个函数内部定义的变量或者函数的形参,都称为局部变量void f(int i){ int j = 20;}这里i和j都属于局部变量局部变量的使用范围:只能在本函数内使用注意的问题全局变量和局部变量命名冲突的问题 在一个函数...原创 2020-02-06 17:22:27 · 227 阅读 · 0 评论 -
判断是否为素数
bool Isprime(int val){int i;for(i=2; i<val; i){ if(val%i ==0) break; if (i == val) return turn; else return false;}}原创 2020-02-05 23:50:54 · 95 阅读 · 0 评论