![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
文章平均质量分 92
chirrupy_hamal
hi, 我是ming.
展开
-
const *与*const的区别
const *p:p指向地址的内容不可变,p可变;*const p:p不可变,p指向地址的内容可变。原创 2020-09-28 18:18:24 · 227 阅读 · 0 评论 -
volatile
volatile:保持内存的可见性,告知编译器,被该关键字修饰的变量,不允许被优化,对该变量的任何操作,都必须在真实的内存中进行操作(每次需从内存中读出以保证内存的可见性)。该关键字在C当中我们已经有所涉猎,今天我们站在信号的角度重新理解一下。[ming@190401 ~]$ cat sig.c#include<stdio.h>#include<signal.h> ...原创 2019-10-30 18:15:39 · 230 阅读 · 0 评论 -
运算符优先级问题
相同优先级中,按结合性进行结合。结合性当一个运算对象两侧的运算符优先级别相同时,则按运算符的结合性来确定表达式的运算顺序。关于结合性的概念在其他高级语言中是没有的,这是C语言的特点之一。在标准C语言的文档里,对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。C语言也将34种运算符规定了不同的结合性。大多数运算符结合方向是...原创 2019-10-25 13:04:20 · 537 阅读 · 0 评论 -
相关字符串函数与内存操作函数的实现
模拟实现strlen方式1int my_strlen(const char *str){ int count = 0; while(*str) { count++; str++; } return count;};方式2//不能创建临时变量计数器//用递归int my_strlen(const char *str){ if(*str == '\0') r...原创 2019-10-24 19:55:24 · 104 阅读 · 0 评论 -
内存操作函数
1、void *memcpy(void *desination, const void *source, size_t num);//从source的位置开始向后复制num个字节的数据到desination的内存位置。//注意:这个函数在遇到’\0’的时候不会停下来。2、void *memmove(void *desination, const void *source, size_t...原创 2019-10-24 18:48:43 · 189 阅读 · 0 评论 -
字符函数和字符串函数
求字符串长度size_t strlen(const char *str);str指向的字符串必须以’\0’结束,strlen函数返回的数值并不包含’\0’。还需要注意的是strlen 的返回值是size_t,是无符号的整型。int main(){ const char str1 = “abcdef”; const char str2 = “hijk”; if(strlen(str2...原创 2019-10-24 16:43:42 · 259 阅读 · 0 评论 -
主机字节序—大小端
主机字节序:cpu对内存进行存取数据的顺序大小端取决于cpu的架构(x86架构的cpu都是小端)字节序针对的是数据存储类型大于1字节的数据,而且不管是大端还是小端,cpu对内存进行存取数据的顺序都是从低地址到高地址。同小异大小端:低字节数据存储在低地址处,高字节数据存储在高地址处。大端:高字节数据存储在低地址处,低字节数据存储在高地址处。判断大小端利用联合体判断大小端union U...原创 2019-10-21 18:37:51 · 323 阅读 · 0 评论 -
malloc之struct _CrtMemBlockHeader
struct _CrtMemBlockHeader它存放了你申请的内存块信息,而这个结构体就存放在malloc所申请 返回的指针上面。typedef struct _CrtMemBlockHeader{ struct _CrtMemBlockHeader *pBlockHeaderNext;//下一个结构体指针 struct _CrtMemBlockHeader *pBloc...原创 2019-10-21 18:00:01 · 746 阅读 · 0 评论 -
野指针和悬垂指针
野指针野指针:指向“垃圾”内存(不可用内存)的指针产生原因:指针创建时未初始化int *p;//此时p为野指针解决办法:指针创建时对其进行初始化int *p = NULL;悬垂指针悬垂指针所指向的空间已经被释放了,但是free后并没有修改指针为NULL,仍旧指向原空间。解决办法:free后,将指针设为NULL。char *p = (char *)malloc(12);free(...原创 2019-10-21 15:00:18 · 567 阅读 · 0 评论 -
C-struct/union/enum
在C语言中,要求一个结构或联合至少有一个成员,enum无所谓。struct A//报错,C 要求一个结构或联合至少有一个成员{};union B//报错,C 要求一个结构或联合至少有一个成员{};enum C//ok{};//enum C的大小仍旧为4struct A{ char a; int b;};union B{ char a; int b;};...原创 2019-10-21 11:51:11 · 576 阅读 · 0 评论 -
柔性数组
也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。C99 中,结构体中的最后⼀个成员允许是未知⼤⼩的数组,这就叫做『柔性数组』。例如:typedef struct st_type{ int i; int a[0];//柔性数组成员} type_a;printf("%d\n", sizeof(type_a));//**输出的是4**//有...原创 2019-10-20 12:54:02 · 241 阅读 · 0 评论 -
动态内存管理
为什么存在动态内存分配我们已经掌握的内存方式开辟方式有:int val = 20;//在栈空间上开辟4个字节char arr[10] = {0};//在栈空间上开辟10个字节的连续空间但是上述的开辟空间的方式有两个特点:1、空间开辟大小是固定的;2、数组在声明的时候,必须指定数组的长度,它所需要的内存在编译时分配。 /* int n = 1; cin >> n...原创 2019-10-20 11:31:35 · 127 阅读 · 0 评论 -
位段
结构体实现 位段 的能力什么是位段位段的声明和结构体是类似的,有两个不同:1、位段的成员必须是int、unsigned int 或 signed int等整型家族成员;2、位段的成员名后边有一个冒号和一个数字。比如:struct A{ int _a:2; int _b:5; int _c:10; int _d:30;};那位段A的大小是多少?在VS08下测试为8...原创 2019-10-19 20:28:03 · 113 阅读 · 0 评论 -
struct结构体的内存对齐
struct结构体的内存对齐规则:1、结构体中第一个成员在 与结构体变量偏移量为0 的位置;2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处;注意:(1) 对齐数 = 编译器默认的一个对齐数 与 该成员所占空间的字节数 的较小值(2) VS中默认的对其数是8,Linux中的默认值为43、成员对其后,结构体自身也要对齐。结构体的总大小为成员中最大的对齐数(每个成员变量都有一个自......原创 2019-10-19 09:35:12 · 3116 阅读 · 0 评论 -
rand与srand间的联系
原创 2019-09-09 10:49:28 · 113 阅读 · 0 评论 -
数组名及数组传参问题
数组名#include<stdio.h>int main(){#if 0 int a[5] = {1,2,3,4,5}; printf("%d\n", sizeof(a));//20,a代表整个数组 printf("%d\n", sizeof(&a));//4,&a只是个(指向整个一维数组的)指针常量,在32位操作系统下,占4字节 printf("%d...原创 2019-09-07 14:45:37 · 575 阅读 · 0 评论 -
虚拟内存的栈、堆分配方式
堆都是动态分配的,没有静态分配的堆,栈有静态和动态2种分配方式。alloca–这个函数的作用是可以从栈里动态分配内存,如果函数A中的某个局部变量在定义时并不知道它有多大,那么就可以将需要使用的空间大小通过函数A的某个参数传递进来,在函数A内部使用alloca分配一块栈内存,alloca函数返回的是这块内存的首指针,而且不用担心内存泄露问题,因为在函数A返回时,通过alloca申请的内存就会被自动...原创 2019-09-06 16:21:03 · 220 阅读 · 0 评论 -
C语言的“简要”介绍
C语言是国际上广泛流行的计算机高级语言。 C语言又是一种用途广泛、功能强大、使用灵活的过程性编程语言,既可用于编写应用软件,又能用于编写系统软件。C语言有以下一些主要特点(1)C语言一共只有37个关键字,9种控制语句。(2)C语言的运算符包含的范围很广泛(它把括号、赋值和强制类型转换等都作为运算符处理),共有34种运算符。灵活使用各种运算符可以实现在其他高级语言中难以实现的运算。(...原创 2018-04-29 20:47:23 · 2893 阅读 · 0 评论 -
算法
一个程序主要包括以下两方面的信息:(1)对数据的描述。 在程序中要指定用到哪些数据以及这些数据的类型和它们的组织形式。这就是数据结构。(2)对操作的描述。 即要求计算机进行操作的步骤,也就是算法。著名计算机科学家沃思提出一个公式:算法+数据结构=程序 直到今天,这个公式对于过程化程序来说依然是适用的。注意:不要认为只有“计算”的问题才有算法,广义地说,为...原创 2018-05-05 02:04:11 · 1129 阅读 · 0 评论