
C
文章平均质量分 76
w
4nc414g0n
这个作者很懒,什么都没留下…
展开
-
函数栈帧的创建和销毁(详细)
函数栈帧的创建和销毁main函数被调用的过程:具体过程 main函数被调用的过程: mainCRTStartup() 调用 _tmainCRTStartup() 再调用 main() 寄存器: ebp(栈底指针),esp(栈顶指针)(sp 是esp的低16位,esp是rsp的低32位,ss是16位堆栈段寄存器) 了解更多:x86汇编学习历程7----从1加到100并显示(引入栈) 具体过程 C代码如下: #include <stdio.h> int Add(int x, int y)原创 2021-08-10 13:10:20 · 770 阅读 · 1 评论 -
C语言----程序编译(预处理)
下面是从test.c到运行结果的大体过程 编译 1)预编译 gcc test.c -E > test.i 预处理后停止 完成文本操作 完成头文件包含 #define定义的符号和宏的替换 去除注释 2)编译 gcc test.i -S 生成test.s的文件 把C语言代码转化为汇编代码 编译部分深入学习编译原理 语法分析 词法分析 语义分析 符号汇总 1).把c程序所有的全局符号汇总(add.c中的全局符号是Add,test.c中全局符号为main和Add) 3)汇编 P原创 2021-07-26 13:38:20 · 421 阅读 · 0 评论 -
C语言----文件操作
加粗样式原创 2021-07-23 11:35:53 · 182 阅读 · 0 评论 -
C语言----四道题充分体会动态内存错误
第一题 void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } 分析: p地址并未返回,str仍为空 strcpy目标地址为空->出错 并且p未被释放->内存泄漏 第二题 char *GetMemory(void) { char p[]原创 2021-07-21 22:51:20 · 165 阅读 · 0 评论 -
C语言----操作和注意点(待补充)
~scanf()和scanf()!=EOF效果相同 scanf的返回值是输入值的个数 如果没有输入值就是返回-1 -1按位取反结果是0 EOF值为-1 数组传参习惯加上断言 assert(arr) 头文件<assert.h> 使用getchar()清除缓冲区 getchar()读取到EOF就结束读取(CTRL+Z)相当于EOF 输入函数是从缓冲区去拿,键盘输入缓冲区 srand((unsigned int)time(NULL)); printf("%d",rand()%100.原创 2021-07-19 10:11:09 · 239 阅读 · 0 评论 -
C语言----动态内存
普通变量创建开辟空间大小是固定的 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配(柔性数组除外,后文会写到) 在内存中如图 所以就有了动态内存 动态内存函数 1)malloc void* malloc( size_t size ); size是分配未初始化储存的字节大小 如果开辟成功,则返回一个指向开辟好空间的指针。 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,...原创 2021-07-18 15:59:34 · 184 阅读 · 0 评论 -
C语言----结构体,枚举,共用体
。。原创 2021-06-13 20:13:19 · 419 阅读 · 0 评论 -
C语言----string函数和memory函数
1.字符串函数 头文件<string.h> strlen() strcpy() strcat() strcmp() strstr() strtok() strerror() 1)strlen() size_t strlen ( const char * str ); 返回类型为无符号整形 所以当遇到strlen("hi")-strlen("hello");结果会是一个正数 模拟实现strlen #include <stdio.h> #include <assert.h>原创 2021-06-07 12:21:31 · 1126 阅读 · 0 评论 -
C语言----数据的存储
数据的存储 数据类型 整形类型 char:0-127(注意:char未规定为是signed char还是unsigned char,但大多数编译器为signed) signed char: -128-127 unsigned char: 0-255 short int: -32768-32767 unsigned short int: 0-65535 int: -32768-32767(注意:int为 signed int) unsigned int: 0-65535 long int: -2147483原创 2021-05-22 14:00:19 · 399 阅读 · 0 评论 -
C语言----指针进阶
C/C++会把常量字符串存储到单独的一个内存区域, 当几个指针。指向同一个字符串的时候,他们实际会指向同一块内存。 但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块 sizeof(数组名),&数组名 表示整个数组,除此之外数组名都是首元素地址 二维数组名是首元素元素的地址 int a[]={1,2,3,4,5}; int b[]={1,2,3,4,5}; int c[]={1,2,3,4,5}; int *arr[3]={a,b,c}; for(int j=0;j<3;原创 2021-06-03 13:57:22 · 175 阅读 · 0 评论