char * 和 void *

POSIX.1 将 read函数的原型做了修改,经典的定义为

1 int read(int filedes, char *buf, unsigned nbytes);

修改为

1 ssize_t read(int filedes, void *buf, size_t nbytes);

主要从以下几个方面考虑

  • First, the second argument was changed from a char * to a void * to be consistent with ISO C: the type void * is used for generic pointers.
  • Next, the return value must be a signed integer (ssize_t) to return a positive byte count, 0 (for end of file), or 1 (for an error).
  • Finally, the third argument historically has been an unsigned integer, to allow a 16-bit implementation to read or write up to 65,534 bytes at a time. With the 1990 POSIX.1 standard, the primitive system data type ssize_t was introduced to provide the signed return value, and the unsigned size_t was used for the third argument. (Recall the SSIZE_MAX constant from Section 2.5.2.)

引自 <Advanced Programming in the UNIX® Environment: Second Edition>

中文名为<UNIX环境高级编程:第二版>

时间: 2024-10-11 05:44:24

char * 和 void *的相关文章

全局结构体变量的初始化以及将结构体变量转换为char类型输出问题

#include<stdio.h> #include<stdlib.h> struct node{ int a; int b; char c; char d; }; /*struct node A; 全局变量不能在这儿进行初始化,令我震惊啊,错误让你迷茫到死 A.a=1; A.b=2; A.c='a'; A.d='c';*/ //struct node A={1,2,'a','c'};但是这种写法可以 1:初始化和赋值不是一个概念. 2:// 在全局空间(即函数体之外)只能执行数据

char* 与char[]区别

[转] 最近的项目中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误.一时也不能说得很明白,网上也搜了一下相关文章发现一些写的比较好的,综合了一下当教育资料备用. char *s1 = "hello";char s2[] = "hello"; [区别所在] char *s1 的s1,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符

char *s 和 char s[] 的区别小结

目前中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误.一时也不能说得很明白,网上也搜了一下相关文章发现一些写的比较好的,综合了一下当教育资料备用. char *s1 = "hello";char s2[] = "hello"; [区别所在] char *s1 的s1,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容

char str[] = {&quot;abcd&quot;}和 char* str = {&quot;abcd&quot;}的区别

char str[] = {"abcd"}和 char* str = {"abcd"}的区别 char* get_str(void) { char str[] = {"abcd"}; return str; } char str[] = {"abcd"};定义了一个局部字符数组,尽管是数组,但它是一个局部变量,返回它的地址肯定是一个已经释放了的空间的地址. 此函数返回的是内部一个局部字符数组str的地址, 且函数调用完毕后 此

char device driver

概览:    第一步:注册设备号                                              信息#tail -f /var/log/message        注册函数:            register_chrdev_region() 或                             查看#lsmod            alloc_chrdev_region()    或                             查看#cat

关于C++中char 型变量的地址输出

在刚开始学习C/C++过程中,我们希望输出各个变量的地址来窥探一些我们"百思不得其解"的现象,例如搞清函数堆栈相关的程序内部秘密. 先看下面示例: #include<stdio.h> #include<iostream> using namespace std; class TestArrange { public: long m_lng; char m_ch1; TestArrange() { m_lng = 0; m_ch1 = 'a'; m_int = 0

void指针的转换(2)

void类型指针能够通过显式转换为具有更小或同样存储对齐限制的指针.但数据可能失真.所谓"同样存储对齐限制"是指void类型指针所指的数据在内存中所占的长度与显式转换后的指针所指的数据在内存中所占的长度相等,比方以上程序中的p1所指的原数据在内存中占2个字节,p2所指的数据在内存中也是占两个数据. 但应注意的是.仅仅有上面的这样的转换前后指针所指数据类型一致的转换才保持数据不失真,假设类型不一致,即使具有同样存储对齐限制,也有可能失真,比方由short转向unsigned short,

int位数的获取及int类型转char *

C语言获取int位数: int intlen(int num){/*参数:要获取长度的int类型数据返回值:返回长度*/ int tmpn=num; int len=1; while(tmpn/=10) len++; return len;} C语言int类型转char *类型: void intostr(char *dest,int num,int intlen){/*参数: dest---将int转换为char *后的存储位置 num---要转换的int类型值 intlen---int类型长

void*&amp;

在我们看程序的时候,通常会遇到void *的问题.尤其是void *后面跟着一个常数的时候,就更不明白了.以下是我在百度里搜出来的解释: (void*)0是把void指针指向的空间地址改为全为0,而(void*)-1就是把void指针指向的空间地址改为全为1,也就是FFFFFFFF(占4字节即32位).其实,void指针的本身空间地址并没有改变,改变的只是void本身空间存储的一个地址,也就是改为00000000或FFFFFFFF. 如下例子: void *a,*b; a=(void*)0; b