c语言
文章平均质量分 56
Stack Overflow?Tan90
Linux系统开发者,计科专业,曾任职于某道Linux系统开发高级讲师、某上市公司系统开发
展开
-
malloc的底层实现
malloc是C语言中用于动态分配内存的函数,其底层实现通常是由操作系统提供的。原创 2023-05-26 14:13:40 · 1040 阅读 · 0 评论 -
常见的内存陷阱
分配不足是与c风格字符串相关的常见问题,大多数情况下,都是因为程序员没有额外分配尾部的’\0’终止符。当创建某个固定大小的空间时,也会发生字符串分配不足的情况。基本的内置c风格字符串函数不会针对固定大小操作,而是有多少写多少,如果超出字符串的末尾,就写入未分配的内存。数据缓冲区分配不足通常会导致内存访问越界。例如上例,写入的数据超出分配的空间大小,导致在分配的空间外写数据,就很可能将内存中重要的部分被改写,导致程序崩溃。在处理由于某种原因丢失’\0’终止符的c风格字符串时,也可能发生内存访问越界。原创 2023-03-28 23:38:26 · 418 阅读 · 0 评论 -
指针存放的位置?
【代码】指针存放的位置?原创 2023-03-26 23:16:41 · 829 阅读 · 0 评论 -
c/c++浮点类型的精度及输出
单精度浮点型:float双精度浮点型:double复数浮点型:float_comlex,double_comple, long long_comple。原创 2023-03-26 17:09:33 · 5142 阅读 · 2 评论 -
static关键字超详细总结
static超详细总结类的静态成员变量不能在初始化列表里初始化,也不能在声明的时候初始化,只能在类外初始化静态成员变量属于声明的类,不属于某个对象,所以既可以采用对象方式访问,也可以采用类名加::的方式访问静态数据成员和普通函数一样遵循public、protected、private访问规则原创 2022-12-04 23:09:33 · 115 阅读 · 0 评论 -
c与c++面试常问区别
c与c++面试常问区别Q:指针与引用的异同点?A:相同点:都是地址的概念指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名区别:指针是一个实体,而引用仅是个别名引用使用时无需解引用(*), 指针需要解引用引用只能在定义的时候初始化一次,之后不能改变,指针可以改变引用没有const,指针有const引用不能为空,指针可以为空sizeof引用,得到的是所指向的变量的大小;而sizeof指针,得到的是指针本身的大小指针和引用的自增(++)运算意义是不一样的原创 2022-04-23 20:45:42 · 1087 阅读 · 0 评论 -
C/C++结构体和类的对比
C/C++结构体和类的对比前言对于类和结构体的区别其实还是很小的,但是总有初学者或者很多年开发经验的工程师搞不清楚!(吐槽:前段时间和某公司开发人员沟通,他居然对这个能搞错,还深信不疑的说他说的对,我的不对,还说让我在环境上试一下,就离谱!他一直这么勇的?)首先我先来对比C和C++中的结构体!在C语言中的结构体和C++中的结构体百分之90是一样的。C语言中结构体中不能定义函数及函数的声明,而C++中是可以的!直接看代码// struct.c#include <stdio.h>s原创 2022-01-04 15:37:24 · 795 阅读 · 0 评论 -
aligned内存对齐
__attribute__((aligned(n)))内存对齐使用环境Linux version 4.15.0-29-generic (buildd@lgw01-amd64-057) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3))关于设置内存对齐方式上有两种方式:__attribute__((aligned(n)))编译器按照n个字节对齐#pragma pack(n) 编译器将按照n个字节对齐;#pragma pack () 取消指定对齐,恢复缺省对齐原创 2021-12-03 18:28:43 · 619 阅读 · 0 评论 -
socket网络编程简介
socket网络编程简介使用tcp协议下的网络编程,基本的API讲解服务端的流程,如下使用socket生成套接口,用于和客户端建立连接int socket(int domain, int type, int protocol);成功返回文件描述符,该描述符用于和对端建立连接使用。失败返回-1,并置错误码参数1:使用IPV4协议填AF_INET,使用IPV6协议填AF_INET6参数2:选择通信的类型:TCP协议填SOCK_STREAM参数3:协议编号,默认填0使用bind函数原创 2021-10-20 11:25:30 · 73 阅读 · 0 评论 -
线程的同步-条件变量
线程的同步线程为了实现同步专门引入一种机制叫做条件变量,当然线程实现同步还有其它方式如互斥锁信号量等!条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。 ------摘自百科条件变量和互斥锁的使用非常类似,互斥锁的用法在我的博客中也有详细讲解(https://blog.csdn.net/weixin_48617416/article/de原创 2021-09-22 10:26:51 · 82 阅读 · 1 评论 -
线程终止清理函数
线程终止清理函数一个线程在执行的时候可以被其它线程cancel,也可能遇到程序崩溃等情况造成线程意外退出;假如线程此时申请了堆空间,或者加了锁之后,意外退出造成堆空间或者锁没有被清理,会出现比较严重的后果,尤其是锁!所以当正在运行的线程一旦出现意外退出后该怎么处理呢?-----使用线程终止清理函数!函数原型://这是一对函数,需要成对的使用void pthread_cleanup_push(void (*routine)(void *), void *arg);//参数1:线程清理函数//参数2原创 2021-09-18 17:31:57 · 195 阅读 · 3 评论 -
Linux线程的创建
Linux线程的创建这里讲POSIX线程的Linux实现,使用的NPTL线程库基本概念:一个进程中至少含有一个主线程(这个是默认的,不需要程序员手动创建),同一个进程中可以创建多个子线程,这些子线程共享进程的地址空间需要注意的是:进程之间创建者进程称为父进程,被创建的进程称为子进程;进程中默认的线程称为主线程,其它统称都叫子线程!线程的创建#include <pthread.h>int pthread_create(pthread_t *thread, const pt原创 2021-09-17 11:46:04 · 289 阅读 · 0 评论 -
内联函数的特点及注意事项
内联函数如果代码中有一些函数频繁的调用,那么会不断的函数参数入栈、出栈,会造成代码时间上的浪费,为了解决这个问题,特别引入了inline修饰符,表示内联函数。内联函数就和带参数宏类似,都是使用函数体直接替换调用处的代码,所以不需要参数入栈出栈,节约了时间!但是需要注意的是,内联函数只适合函数功能简单,操作少,被调用多的条件下,这样才能对代码效率进行提升。当内联函数中,函数体功能复杂,需要循环、嵌套等大量操作,那么当内联函数体在编译时替换调用处代码,会占据大量的内存,而且编译的时间有可能也会原创 2021-09-14 11:37:14 · 2161 阅读 · 0 评论 -
指针数组与数组指针
指针数组与数组指针前言:对于c语言初学者对这两个概念常常弄混,我当时刚学时,去看大佬博客,大佬们写的很多,强忍着看完了,觉得自己看懂了,接着就下一个知识点了,过了两天又忘了。。。编程的学习绝对是不能脱离实际的,实践是检验真理的唯一标准,所以检验自己到底会不会直接写代码检验一下是最好的(这里可不是让你背博客代码,也不是让你抄写,而是看会了之后用自己的方式实现一下,不看任何参考代码)。下面我将用代码的形式清晰的给你展示这两者的区别!指针数组:定义:类型 *名字[数组大小],如char *p[6];首先原创 2021-09-10 17:49:13 · 250 阅读 · 0 评论 -
数组、指针的区别
数组、指针的关系常常有同学把数组和指针混为一谈,认为指针和数组是等同的!这样的思维是不对的。数组和指针在某些场景下用法是相同的,但绝对不能说(指针=数组)这种结论,下面将指出它们的区别:在声明数组的时候,编译器同时给数组分配了指定大小的空间,用于容纳数组的元素;而声明一个指针的时候,编译器只分配了容纳指针本身的空间(如64位系统中8个字节)。int arr[10] = {0};int *p = NULL;① printf("arr = %d\n", *arr);② print原创 2021-09-10 10:45:49 · 47 阅读 · 0 评论 -
sprintf与sscanf
sprintf与sscanf前言这两个函数我基本上没使用过,今天感兴趣研究了一下,发现这两个函数和printf、scanf的功能相差还是比较大的。去网上看了一些讲解,写的很全,很详细,但是我比较懒,一看到字太多了,就不是很想继续阅读了,于是就简单写了一些小“栗子”,来看一下这两个函数的是干嘛的!以下代码只演示出这两个函数最常用的功能,不代表所有用法!sprintf拼接功能#include <stdio.h>int main(int argc, char **argv){原创 2021-09-08 12:04:14 · 112 阅读 · 0 评论 -
左值与右值
左值与右值**前言:**对于编程初学者经常对左值和右值的概念区分不清楚,网络上好多解答也是模模糊糊,看完他的解答直接蒙了。我初学的时候看过b站的讲解,也去博客看大佬的讲解,给我的感受就是,这说的是啥,我看不懂啊!下面我将用最简洁的描述,带你区分什么是左值,什么是右值?直接上结论:等号的左边、能取地址的是左值,反之就是右值例1:int a = 0;a = 10;//显然我们可以对a取地址(&a)操作,a是左值,10是右值, 而且没法对一个常量取地址操作例2:int a = 0;in原创 2021-09-07 17:43:36 · 163 阅读 · 2 评论 -
C语言--static的作用
C语言–static的作用对于C语言初学者常常对static这个关键字的作用不是很清楚,在面试过程中也没有把它的用法表述全。下面我将用代码的形式把static的用法给展示出来作用1:static修饰变量,可以保持变量的持久性#include <stdio.h>void func(){ int num = 1; num *= 2; printf("num = %d\n", num);}void func1(){ //将num声明为静态变量原创 2021-09-07 11:31:04 · 100 阅读 · 0 评论 -
指针常量与常量指针的区别
指针常量与常量指针对于c的初学着总是分不清常量指针及指针常量,下面我将用代码的方式直观的讲解一下这两个的区别!常量指针#include <stdio.h>int main(int argc, char **argv){ int a = 10; int b = 7; //定义常量指针 int const *p; p = &a; printf("p = %d\n", *p); //常量指针可以改变指针指向的内容原创 2021-09-06 20:14:33 · 44 阅读 · 0 评论