char

堆和栈的区别(转过无数次的文章)

我怕爱的太早我们不能终老 提交于 2020-03-13 11:37:31
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 - 程序结束后由系统释放。 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来得10和20字节的区域就在堆区。

c/c++连接mysql数据库

女生的网名这么多〃 提交于 2020-03-13 11:31:44
环境:win7 x64、vs2008、mysql 对于已经安装mysql的,查看mysql安装目录,如果安装目录下没有include和lib目录, 说明没有完全安装,需要下载mysql-connector类库,官方下载地址: http://dev.mysql.com/downloads/connector/c/ 部分截图如下,从图左侧可看出,官网提供了c、c++、Python、J等语言的链接库,根据个人情况下载。 下面开始配置vs2008,大致需要三步。 由于我们要使用Mysql的API,并且我们机子上肯定安装了Mysql数据库,所以我们要将工程的头文件路径指向Mysql安装目录的同文件mysql.h所在的位置,将连接库路径指向libmysql.lib所在的路径, 这两个文件一般在include、lib目录下。 新建一个项目,右键该项目,选择属性,弹出属性对话框。 第一:将x项目属性页的C/C++->常规->附加包含目录指向mysql.h所在的位置:C:\Program Files\MySQL\MySQL Server 5.1\include 第二:将项目属性页的链接器->常规->附加库目录指向libmysql.lib所在的路径:C:\Program Files\MySQL\MySQL Server 5.1\lib. 第三:将链接器->输入->附加依赖项中添加libmysql

Why does the function `memchr()` use `int` for the argument of `char` type?

眉间皱痕 提交于 2020-03-13 07:44:45
问题 The following function uses int as the second argument type, memchr(const void *buf, int ch, size_t count); Though it is used for a character type. Why is the function defined to use int for the argument of char type? Are there any special reasons for this? 回答1: It is so because this is a very "old" standard function, which existed from the very early times of C language evolution. Old versions of C did not have such things as function prototypes . Functions were either left undeclared, or

c 的陷阱

你说的曾经没有我的故事 提交于 2020-03-12 22:22:13
c语言算是非常古老了,像瑞士军刀灵活却也很容易伤到自己,即使是多年的老杆子,以致于市面上都有一本经典的C的书叫《C陷阱与缺陷》的书。 这个文章总结下c中常见的陷阱,可能在日常工作或面试题目中遇到。 1. sizeof 陷阱 sizeof 它是一个编译时运算符而非函数,用于判断变量或数据类型的字节大小。 比较常见的用法: int arr[] = { 1, 2, 3 }; for (int i = 0; i < sizeof(arr) / sizeof(int); i++) { printf("%d,", arr[i]); } sizeof(arr)的是整个数组的占字节数大小,除int占字节大小就是整个数组的大小了,但是如果不小心这样用了: void clear(char array[]) { int i; for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) { array[i] = 0x00; } } int main(void) { char arr[20]; clear(arr); } 问题: 这段代码的问题,在于clear中传递的是指针,这时候sizeof(char*) 一般为4,sizeof(array[0]),造成了结果是只对数组的前四个变量赋值为0,其他的没有赋值! 2. 小心无符号类型 先看段代码:

字符串指针法赋值

守給你的承諾、 提交于 2020-03-12 19:20:07
1 //字符串指针法赋值 2 # include<stdio.h> 3 char a[]="I am a student!"; 4 char b[20]; 5 char *p1=a,*p2=b; 6 int main() 7 { 8 while(*p2++=*p1++); //while(*b++=*a++)或while((*b++=*a++)!=0) 9 printf("%s\n",b); 10 printf("%s\n",b); 11 for(int i=0;*(b+i)!=0;i++) 12 printf("%c",*(b+i)); 13 printf("\n"); 14 return 0; 15 } 运行结果: 来源: https://www.cnblogs.com/bboykaku/p/12481922.html

NOIP模拟测试11

☆樱花仙子☆ 提交于 2020-03-12 17:11:38
这次考试T1想到了正解没有去实现,然后就死了,不过我估计就算想到正解也会挂(26^2和暴力一个分),肝了两个小时T2屁都没蹦出来,T3没有搞清那个式子的含义。 (不过一分没挂) T1:string 开26棵线段树维护,还有一种更快的方法:对于每个树上的节点,只有左右儿子字符相同时才更新,不然不更新,这种打法将26换成了较小的常数,并且不需要memset,真是 出家旅行必备 骗分之良器 1 #include <bits/stdc++.h> 2 3 typedef long long LL; 4 5 inline int rd() { 6 int a = 1, b = 0; char c = getchar(); 7 while (!isdigit(c)) a = c == '-' ? 0 : 1, c = getchar(); 8 while (isdigit(c)) b = b * 10 + c - '0', c = getchar(); 9 return a ? b : -b; 10 } 11 12 const int N = 100000 + 2333; 13 14 int n, m; char str[N]; 15 16 int same[N * 3]; 17 18 #define ls(p) p << 1 19 #define rs(p) p << 1 | 1 20 21

iOS开发数据库篇—SQLite常用的函数

核能气质少年 提交于 2020-03-12 11:32:09
一、简单说明 1.打开数据库 int sqlite3_open( const char *filename, // 数据库的文件路径 sqlite3 **ppDb // 数据库实例 ); 2.执行任何SQL语句 int sqlite3_exec( sqlite3*, // 一个打开的数据库实例 const char *sql, // 需要执行的SQL语句 int (*callback)(void*,int,char**,char**), // SQL语句执行完毕后的回调 void *, // 回调函数的第1个参数 char **errmsg // 错误信息 ); 3.检查SQL语句的合法性(查询前的准备) int sqlite3_prepare_v2( sqlite3 *db, // 数据库实例 const char *zSql, // 需要检查的SQL语句 int nByte, // SQL语句的最大字节长度 sqlite3_stmt **ppStmt, // sqlite3_stmt实例,用来获得数据库数据 const char **pzTail ); 4.查询一行数据 int sqlite3_step(sqlite3_stmt*); // 如果查询到一行数据,就会返回SQLITE_ROW 5.利用stmt获得某一字段的值(字段的下标从0开始) double sqlite3

《深度探索C++对象模型》第三章:Data 语意学

ぃ、小莉子 提交于 2020-03-12 11:22:57
sizeof 内存对齐的一些规则: #pragma pack(n) 预编译指令,可用来设置多少个字节对齐,n的缺省数值是按照编译器自身设置,一般为8,合法的数值分别是1、2、4、8、16,其它的无效。 offset从0开始,每个数据成员开始存放的offset值为min(n, 数据成员大小)的整数倍。 在数据成员完成各自的存放之后,整个类也将进行内存对齐,其大小为min(n, 整个类中最大成员的大小)的整数倍。 如果一个类是空类,即里面无任何数据成员,那么它会有一个隐藏的1 byte 大小,那是被编译器安插进去的一个char,这使得两个objects得以在内存中配置独一无二的地址。 sizeof的大小受到三个因素的影响: 语言本身所造成的额外负担(vptr、vbptr(有些编译器有,也有可能会共用vptr)) 编译器对于特殊情况所提供的优化处理(如空类) 内存对齐的限制 class X {}; class Y : public virtual X {}; class Z : public virtual X {}; class A : public Y, public Z {}; int main() { cout << sizeof(X) << endl; //1 cout << sizeof(Y) << endl; //4 cout << sizeof(A) << endl; /

体系结构相关(面经)

拈花ヽ惹草 提交于 2020-03-12 08:51:20
1、什么是内存对齐以及为什么要内存对齐? 内存对齐: 编译器 将程序中的每个“数据单元”安排在适当的位置上。 简单理解:按照 某种规则 将我们定义的结构体成员放在合适的地址偏移位置上存储。 举一个例子: //32位系统 #include<iostream> using namespace std; struct{ int x; char y; }s; int main() { cout << sizeof(s) << endl; return 0; } 问题:上述代码的输出是多少? 答案:8 为什么要额外的3字节去填充这个结构体?一个原本5字节的结构现在变成8 字节,几乎扩大了 2 倍的存储空间,这样的空间开销是否值得?又是什么样的原因导致这样的设计? 内存对齐的原因 1.内存以 字节为单位 : 内存是以字节为单位存储,但是处理器并不会按照一个字节为单位去存取内存。处理器存取内存是块为单位,块的大小可以是2,4,8,16字节大小,这样的存取单位称为 内存存取粒度 。如果在64位的机器上,不论CPU是要读取第0个字节还是要读取第1个字节,在硬件上传输的信号都是一样的。因为它都会把地址0到地址7,这8个字节全部读到CPU,只是当我们是需要读取第0个字节时,丢掉后面7个字节,当我们是需要读取第1个字节,丢掉第1个和后面6个字节。所以对于计算机硬件来说,内存只能通过特定的对齐地址进行访问。

标准库头文件:cstdio

穿精又带淫゛_ 提交于 2020-03-12 08:09:39
1.常用变量 FILE //类型,保存控制C I/O流所需的全部信息 fpos_t //类型,指定文件中的位置 size_t //sizeof 运算符返回的无符号整数类型 NULL //空指针常量 BUFSIZ //std::setbuf 所用的缓冲区大小 stdin //与输入流关联到 FILE* 类型表达式 stdout //与输出流关联的 FILE* 类型表达式 stderr //与错误输出流关联的 FILE* 类型表达式 EOF //拥有int类型和负值的整数常量表达式,表示流末尾 FOPEN_MAX //能同时打开的最大文件数 FILENAME_MAX //文件名称的最大长度 SEEK_SET //给std::fseek的参数,指示从文件起始寻位 SEEK_CUR //给std::fseek的参数,指示从当前文件位置寻位 SEEK_END //给std::fseek的参数,指示从文件尾寻位 2.常用操作 std::FILE* fopen( const char* filename, const char* mode );//打开文件,mode有r,w,a,r+,w+,a+,打开失败返回NULL int fclose( std::FILE* stream );//关闭文件,返回0表示成功 int fflush( std::FILE* stream );//清空缓冲区