C语言18 指针与字符串

字符串的几种表示方式有什么区别? char str[6] = {"A","B","C","D","E","F"}; //"\0" 或者0 --堆栈中 局部变量 char str[] = "ABCDE"; //编译器末尾填0 常量区 char* str= "ABCDE"; //常量区 //打印 printf("%s \n",str); //字符串打印时 遇到 0 才会停止 常用的字符串函数 1、int strlen(char* s) 返回值是字符串S的长度,不包括结束符"/0" 弊端:字符串中英文混合的话。返……

Continue reading

C语言17 数组参数传递

基本类型参数传递 int x =1; void plus(int p) { p = p+1; } printf("%d \n",x); //x的值是多少? 数组作为参数 编写一个函数,能够打印任意整形数组的值 void PrintArray(int arr[],int nLength) {……

Continue reading

C语言16 取值运算符

“*”的几种用途 乘法运算符 int x = 1; int y = 2; int z = x * y; 定义新的类型 char x; char* x; 取值运算符 指针类型的变量 int* a =(int*)1; printf("%x \n",(a +1)); 10: int a =(int*)1; 00401028 mov dword ptr [ebp-4],1 11: printf("%x \n",*(a +1)); 0040102F mov eax,dword ptr [ebp-4] 00401032 mov ecx,dword ptr [eax+4] 00401035 push ecx 00401036 push offset string “%x \n” (0042201c) 0040103B call printf (00401070) 00401040 add esp,8 当然这里运行的时候肯定出错 因为 1 是一个异常的不存在的地址 探测 * 指针类型 的类型 int*** a; int***** b; int******* c; int*……

Continue reading

C语言15 取地址符号&的使用

&符号是取地址符,任何变量都可以使用&来获取地址,但不能用在常量上 struct Point { int x; int y; }; char a; short b; int c; Point p; printf("%p %p %p %p \n",&a,&b,&c,&p); printf("%x %x %x %x \n",&a,&b,&c,&p); printf("%x \n",&10); 16: char a; 17: short b; 18: int c; 19: Point p; 20: 21: printf("%p %p %p %p \n",&a,&b,&c,&p); 0040D408 lea eax,[ebp-14h] 0040D40B push eax 0040D40C lea ecx,[ebp-0Ch] 0040D40F push ecx 0040D410 lea edx,[ebp-8] 0040D413 push edx 0040D414 lea eax,[ebp-4] 0040D417 push eax 0040D418 push offset string "%p %p %p %p \n" (00422e90) 0040D41D call printf (0040d6c0) 0040D422 add esp,14h 22: printf("%x %x %x %x \n",&a,&b,&c,&p); 0040D425 lea ecx,[ebp-14h] 0040D428 push……

Continue reading

C语言14 指针类型

C语言14 指针类型 指针是C语言中的一种数据类型, 定义带 *类型的变量 char x; char* x; short y; short* y; int z; int* z; float f; float* f; double d; double* d; Student st; Student* st; 总结: 任何带有*的变量类型的标准写法:变量类型* 变量名 任何类型都可以带* 加上* 以后是新的类型,统称为“指针类型” *可以使任意多个。 指针变量赋值 char* x; char*** x; char******* x; short* ~~ int* ~~ Student* ~~……

Continue reading

Online.net 的ubuntu增加ipv6地址

官方教程有问题 这里总结下,省的下次又不会配了 配置 ipv6 block 打开 https://console.online.net/en/network/ 创建子网 配置 仓储地址 编辑 sources.list sudo vim /etc/apt/sources.list 在末尾增加dhcp6的源地址 #DHCP6 Client deb http://httpredir.debian.org/debian experimental main 然后创建 apt 偏好文件 sudo vim /etc/apt/apt.conf.d/99defaultrelease 这里 14.04填写 APT::Default-Release "jessie"; 16.04填写 APT::Default-Release "xenial"; 更新apt源 sudo apt update sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B48AD6246925553 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7638D0442B90D010 安装设置DHCP6 客户端 sudo apt-get install odhcp6c 然后测试……

Continue reading

HttpClient缺陷引起的 无法连接到远程服务器 通常每个套接字地址只允许使用一次

上周又遇到了坑爹问题,具体表现为 服务端接口全部调用失败。 排查日志发现,有大量的 错误日志为 System.Net.Http.HttpRequestException: 发送请求时出错。 ---> System.Net.WebException: 无法连接到远程服务器 ---> System.Net.Sockets.SocketException: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 xxxxx.xx:6666 在 System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult) 在 System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception) --- 内部异常堆栈跟踪的结尾 --- 在 System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context) 在 System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar) 同时……

Continue reading

结构体 字节对齐的练习

分析结构体大小 struct S1 { char c1; double d; char c2; char c3; }; struct S2 { char c1; char c2; char c3; double d; }; struct S3 { char c1; S1 s; char c2; char c3; }; 分析结构体大小 #pragma pack(1) struct S1 { char c1; double d; char c2; char c3; }; #pragma pack() struct S3 { char c1; S1 s; char c2; char c3; }; 分析结构体大小 #pragma pack(4) struct S1 { char c1; double d; char c2; char c3; }; #pragma pack() struct S3 { char c1; S1 s; char c2; char c3; }; 分析结构体大小 struct S1 { char c1; double d; char c2; char c3; }; #pragma pack(1) struct S3 { char c1; S1……

Continue reading

C语言 13 结构体数组

结构体数组的定义 类型 变量名[常量表达式]; //定义结构体类型 struct stStudent { int Age; int Level; } //定义结构体变量 struct stStudent st; //定义结构体数组 struct stStudent arr[10]; //或者 stStudent arr[10]; 结构体数组初始化 struct stStudent{ int Age; int Level; }; struct stStudent arr[5] = {{0,0},{1,1},{2,2},{3,3},{4,4}}; //或者 arr[0].Age=100; arr[0].Level=100; 结构体成员的使用 格式 : 结构体数组名[下标].成员名 arr[0].Age = 10; 字符串成员的处理 struct stStudent{ int Age; char Name[0x20]; } struct stStudent……

Continue reading

C语言12 字节对齐

#include char x; short y; int check() { x =1; y=2; return 0; } int main(int argc, char* argv[]) { check(); system("pause"); return 0; } //上述代码中 check 函数的反汇编 13: x =1; 00401038 C6 05 E2 55 42 00 01 mov byte ptr [x (004255e2)],1 14: y=2; 0040103F 66 C7 05 E0 55 42 00 mov word ptr [y (004255e0)],offset check+26h (00401046) //下面将y的类型改为 int #include char x; int y; int check() { x =1; y=2; return 0; } int main(int argc, char* argv[]) { check(); system("pause"); return 0; } //上述代码中 check 函数的反汇编 13: x =1; 00401038 C6 05 E4 55 42 00 01 mov byte ptr [x (004255e4)],1 14:……

Continue reading