c语言buff函数 c语言fib函数

c语言如何将一段自定义的buff转换成可执行的代码__declspec (noinline) void helloworld()
{
printf("hello world");
004017C0 68 E0 21 42 00pushoffset string "hello world" (4221E0h)
004017C5 E8 78 A4 00 00callprintf (40BC42h)
004017CA 59popecx
}
因为代码生成c语言buff函数的汇编指令call是相对位置的
E8 78 A4 00 00 这个c语言buff函数,e8表示相对地址调用,后面78 A4 00 00 表示的 当前的地址和 printf函数地址的偏移 。
如果自己memcpy复制后, helloworld函数的地址变c语言buff函数了,那个call指令和 printf函数的偏移距离也变了 。所以就出错了 。
所以这个复制代码的方式要正常工作的话,这段代码必须是位置无关的 , 也就是
Position-independent code
gcc里面可以指定pic选项来让编译器生成位置无关的代码 。vc里面找了一下没找到 。
所以只能使用汇编才行了 。
char format[] = "%s %s\n";
char hello[] = "Hello";
char world[] = "world";
static int printf_addr = (int)printf;
__declspec (noinline) void helloworld()
{
//printf("hello world");
__asm
{
moveax, offset world
push eax
moveax, offset hello
push eax
moveax, offset format
push eax
//call printf
mov eax, printf_addr
call eax
//clean up the stack so that main can exit cleanly
//use the unused register ebx to do the cleanup
popebx
popebx
popebx
}
}
这样写之后,这个call指令那里,生成的机器码采用的是绝对值的FF,就可以正常工作了 。
所以这种用法的话,还是自己手写位置无关的汇编才行,或者需要会自己做重定位的 。就像上面那个一样 自己知道call指令的那里的话,可以自己修改偏移为正确的值 。
在C语言中send buff的用法?C语言中的标准库中是没有Send函数的 。
从名称来看应该是自定义的函数 。具体实现的功能、参数及调用的要求,需要在阅读函数之后才能得到结论 。
当然如果是C的话,在Tcp中是具备Send函数的 。具体见下:
send()用于向一个已经连接的socket发送数据,如果无错误,返回值为所发送数据的总数,否则返回SOCKET_ERROR 。
简述
向一个已连接的 套接口发送数据 。
#includewinsock.h
int PASCAL FAR send( SOCKET s, const char FAR* buf, int len, int flags);
s:一个用于标识已连接套接口的描述字 。
buf:包含待发送数据的 缓冲区 。
len:缓冲区中数据的长度 。
flags:调用执行方式 。
注释
send()适用于已连接的数据包或流式 套接口发送数据 。对于数据报类套接口,必需注意发送数据长度不应超过 通讯子网的IP包最大长度 。IP包最大长度在 WSAStartup()调用返回的WSAData的iMaxUdpDg元素中 。如果数据太长无法自动通过下层协议,则返回WSAEMSGSIZE错误 , 数据不会被发送 。
请注意成功地完成send()调用并不意味着 数据传送到达 。
如果传送系统的 缓冲区空间不够保存需传送的数据,除非套接口处于非阻塞I/O方式,否则send()将阻塞 。对于非阻塞SOCK_STREAM类型的套接口,实际写的数据数目可能在1到所需大小之间 , 其值取决于本地和远端主机的 缓冲区大小 。可用 select()调用来确定何时能够进一步发送数据 。
在相关套接口的选项之上,还可通过标志位flag来影响函数的执行方式 。也就是说,本函数的语义既取决于套接口的选项也取决于标志位 。后者由以下一些值组成:
值意义
MSG_DONTROUTE 指明数据不选径 。一个WINDOWS套接口供应商可以忽略此标志c语言buff函数;MSG_OOB 发送带外数据(仅适用于SO_STREAMc语言buff函数;) 。
返回值
若无错误发生,send()返回所发送数据的总数(请注意这个数字可能小于len中所规定的大?。?。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应 错误代码 。
错误代码:
WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup() 。
【c语言buff函数 c语言fib函数】WSAENETDOWN:WINDOWS 套接口实现检测到网络子系统失效 。
WSAEACESS:要求地址为广播地址,但相关标志未能正确设置 。
WSAEINTR:通过一个 WSACancelBlockingCall()来取消一个(阻塞的)调用 。
WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中 。
WSAEFAULT:buf参数不在用户 地址空间中的有效位置 。
WSAENETRESET:由于WINDOWS套接口实现放弃了连接,故该连接必需被复位 。
WSAENOBUFS:WINDOWS套接口实现报告一个 缓冲区 死锁 。
WSAENOTCONN:套接口未被连接 。
WSAENOTSOCK:描述字不是一个套接口 。
WSAEOPNOTSUPP:已设置了MSG_OOB , 但套接口非SOCK_STREAM类型 。
WSAESHUTDOWN:套接口已被关闭 。一个套接口以1或2的how参数调用 shutdown()关闭后 , 无法再用send()函数 。
WSAEWOULDBLOCK:
WSAEMSGSIZE:套接口为 SOCK_DGRAM类型,且数据报大于WINDOWS套接口实现所支持的最大值 。
WSAEINVAL:套接口未用 bind()捆绑 。
WSAECONNABORTED:由于超时或其c语言buff函数他原因引起虚电路的中断 。
WSAECONNRESET:虚电路被远端复位 。
C语言关于数组赋初值的问题char buff[10]={0};需要注意的是:char
buff[5]={0};和char
buff[5]={'0'};是两个完全不同的概念:
char
buff[5]={0};的赋的是一个字符串的结束符,而不是一个字符'0';
char
buff[5]={'0'};才是给第一个字符赋值为'0' 。
大家喜欢用char
buff[5]={0};主要是想制造一个空的字符串,
你调试一下就知道了:
如果这样写:
#include
void
main
{
char
buff[5]={0};
printf("%s",buff);
}
是没有任何输出的,因为printf遇到的buff的第一个字符就是个字符串的结束符'\0'
而如果这样写:
#include
void
main
{
char
buff[5]={'0'};
printf("%s",buff);
}
才会看到输出了一个'0'
这才是你理解的给第一个单元赋值为‘0’ 。
char
buff[5]={0};是一种定义空字符数组的严谨的写法!
关于C语言语句buff[i] = ((WAVEBUFF *)&WaveBuff)[i].Ia;WAVEBUFF *)是表示WAVEBUFF 类型的指针 。
((WAVEBUFF *)WaveBuff)是取出WaveBuff的地址 , 并强制转换为WAVEBUFF 类型的指针 。
((WAVEBUFF *)WaveBuff)[i]是表示数组指针,(WAVEBUFF *)WaveBuff是指向有n个WAVEBUFF 类型元素的一维数组的指针,而[i]是表示这个一维数组的第i个元素,即((WAVEBUFF *)WaveBuff)[i]是指向一个元素类型为WAVEBUFF 的一维数组的第i个元素的指针 。.Ia是取出结构体WAVEBUFF 中结构成员la的值,并赋值给buff[i] 。
C语言中的buff是什么?eg:char buff[BUFFSIZE];buff是数组名字 , 中文解释是缓冲区,一般程序员习惯用buff在存放字符串 。
C语言实现循环buff,每次读取数据都是从写指针的位置往前推N个字节开始读?。晗溉缦旅枋觯?/h2>循环读取一个文件的内容 。
这样做没有任何意义,不如把读取的内容保持在变量当中 , 节省空间时间 。如果非要反复读取的话可以使用rewind函数把文件指针重置 。
函数名: rewind()功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动 。而文件指针是指向整个文件 , 如果不重新赋值文件指针不会改变 。rewind函数作用等同于 (void)fseek(stream, 0L, SEEK_SET);
循环读取多个文件的内容 。
把多个文件名存在一个字符串数组当中 。使用循环语句反复打开-读取-关闭即可 。
例如:
char * s[3]={"文件一","文件二","文件三"};for(i=0;i3;i){f=fopen(s[i]); //打开第i个文件//读取数据fclose(f);//关闭文件}
关于c语言buff函数和c语言fib函数的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读