这是我在简单实验中所做的事情;
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int fun()
{
int d=10;
write(1,(int*)d,sizeof(d));
}
int main()
{
int x;
fun();
read(1,(int*)x,4);
printf("x=%d\n",x);
return 0;
}
如您所见,我试图通过IO流(IO文件)d
访问fun()
函数中的stdout
值;我也尝试使用stdin
,但事情是x
值没有变化。 (我在在线IDE中尝试过。)但是根据我的思维流,它应该更改为d
的值。
任何人都可以帮我看看为什么不这样做?
答案 0 :(得分:3)
读取和写入需要指针。在您的情况下,它是&d
和&x
。将int
投射到int*
通常没有任何意义。
答案 1 :(得分:2)
首先,正确调用read()
和write()
将包括获取指向您的变量并传递它的指针。
其次,您从stdout(文件描述符1)读取和写入,而不是您的描述。如果您从stdout
而不是stdin
读取,则无关紧要
https://stackoverflow.com/a/7680234/2543937
第三,最好使用unistd.h
定义(STDOUT_FILENO
,STDIN_FILENO
等),而不是直接使用fd数字。
int d, x;
write(STDOUT_FILENO, &d, sizeof(d));
read(STDOUT_FILENO, &x, sizeof(x));
printf("x=%d\n", x);
关于我认为您最初的想法:当您从stdout
(或stdin
)读取时,数据来自键盘输入,而不是来自之前打印到屏幕的内容 - 因此d
的值不应该转到x
。
答案 2 :(得分:1)
替换行:
write(1,(int*)d,sizeof(d));
with:
write(1, &d, sizeof(d));
和行:
read(1,(int*)x,4);
with:
read(1, &x, 4);
此次修改的原因:
正如您在this reference for read()中看到的,函数read
的原型是:
ssize_t read(int fd, void *buf, size_t count);
和函数write
的原型分别为:
ssize_t write(int fd, const void *buf, size_t count);
如this reference for write()所示。
因此,两个函数都需要指针作为第二个参数。因此,您必须将内存地址传递给他们。
注意: 您尝试通过将指针强制转换为int*
来生成指针。实际上,int*
表示声明或原型中的指针,但是当您在变量名称前面使用*
时,它表示此内容变量。符号&
用于表示变量的地址。