LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1365|回复: 11

关于write函数的疑问

[复制链接]
发表于 2006-4-17 17:35:00 | 显示全部楼层 |阅读模式
char *w_buf;
...
write(pipe_fd[1],w_buf,4)
或者write(pipe_fd[1],"abc",4)


write的两种写法都不报错,也就是说w_buf应该是一个字符串变量
如果这样,定义的时候岂不是应该这样写:char w_buf

如果定义写成char *w_buf的话,那么*w_buf指的是一个字符串变量,w_buf应该是字符串变量的地址吧?
我的意思是,如果定义的时候写char *w_buf的话,write语名应该这样写才对:
write(pipe_fd[1],*w_buf,4)
再说了,write原型是:
       #include <unistd.h>
       ssize_t write(int fd, const void *buf, size_t count);
第二个参数是一个变量,而非地址。
但是这样程序编译时报错;
pipe_write.c:33: 警告:传递参数 2 (属于 ‘write’)时将整数赋给指针,未作类型转换
发表于 2006-4-17 18:03:29 | 显示全部楼层
write函数没有一点问题。
倒是你应该复习c语言指针一节。反复看几遍,然后大声说:我上面的都是胡言乱语。
回复 支持 反对

使用道具 举报

发表于 2006-4-18 09:40:15 | 显示全部楼层
同意小猪,凑字凑字凑字凑字凑字
回复 支持 反对

使用道具 举报

发表于 2006-4-18 12:09:58 | 显示全部楼层
faint faint faint faint
回复 支持 反对

使用道具 举报

发表于 2006-4-18 13:38:40 | 显示全部楼层
Post by samwang
char *w_buf;
...
write(pipe_fd[1],w_buf,4)
或者write(pipe_fd[1],"abc",4)


write的两种写法都不报错,也就是说w_buf应该是一个字符串变量
如果这样,定义的时候岂不是应该这样写:char w_buf

如果定义写成char *w_buf的话,那么*w_buf指的是一个字符串变量,w_buf应该是字符串变量的地址吧?
我的意思是,如果定义的时候写char *w_buf的话,write语名应该这样写才对:
write(pipe_fd[1],*w_buf,4)
再说了,write原型是:
       #include <unistd.h>
       ssize_t write(int fd, const void *buf, size_t count);
第二个参数是一个变量,而非地址。
但是这样程序编译时报错;
pipe_write.c:33: 警告:传递参数 2 (属于 ‘write’)时将整数赋给指针,未作类型转换

晕,一派胡言!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-18 21:01:17 | 显示全部楼层
const void *buf
这个的意思是不是定义buf是一个指向常数的指针?
常数不可改,但指针可以改?

没错啊,*buf不是代表一个字符串么?
这个地方怎么理解撒
回复 支持 反对

使用道具 举报

发表于 2006-4-18 21:53:01 | 显示全部楼层
Post by samwang
const void *buf
这个的意思是不是定义buf是一个指向常数的指针?
常数不可改,但指针可以改?

这个问题倒是可以回答你一下,你的理解差不太多了,就是指这个buf指针所指向的一块内存区域是只读的。 buf的值本身的确可以在函数里面改,但一般改了没有意义,因为其改动只在函数内部可见,函数返回后,你传进去的实参(即buf的值,即一个地址值)又恢复原值了。
这样的答复可还满意?
Post by samwang

没错啊,*buf不是代表一个字符串么?
这个地方怎么理解撒

不是让你回去复习(预习?)c程序设计的指针部分了吗,怎么还问这个问题,
什么"没错啊",错大了。
好好看书:beat
回复 支持 反对

使用道具 举报

发表于 2006-4-19 16:57:47 | 显示全部楼层
哈哈~~~~又一个中谭浩强毒的人出现了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-20 17:58:20 | 显示全部楼层
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
第二个参数是一个变量,而非地址。

这个地方应该理解为第二个参数是一个地址。而不是地址指向的那块存储区的值。
如果是这样,那么像这样引用函数就OK了:
char *w_buf;
...
write(pipe_fd[1],w_buf,4)
因为w_buf也是一个地址。

但还是不明白write(pipe_fd[1],"abc",4)
这里面"abc"也代表着一个地址啊?
回复 支持 反对

使用道具 举报

发表于 2006-4-20 18:36:02 | 显示全部楼层
Post by samwang
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
第二个参数是一个变量,而非地址。

这个地方应该理解为第二个参数是一个地址。而不是地址指向的那块存储区的值。
如果是这样,那么像这样引用函数就OK了:
char *w_buf;
...
write(pipe_fd[1],w_buf,4)
因为w_buf也是一个地址。

但还是不明白write(pipe_fd[1],"abc",4)
这里面"abc"也代表着一个地址啊?

这话,自相矛盾呀......
你需要休息一下了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表