在 C++ 中的写入系统调用中发送动态数组的问题
Posted
技术标签:
【中文标题】在 C++ 中的写入系统调用中发送动态数组的问题【英文标题】:Problem with sending dynamic array in write system call in c++ 【发布时间】:2021-07-25 02:49:35 【问题描述】:我使用 fork 创建了两个进程,我想使用 write 和 read 系统调用将堆内存上的整数数组发送到子进程。在父进程中,如果我在堆栈上创建数组,问题就解决了,但我想在堆中进行。下面是我的代码:
int fd[2];
pipe(fd);
pid_t p=fork();
if(p>0)
close(fd[0]);
int *info=new int[7];
info[0]=1;
info[1]=2;
info[2]=3;
info[3]=3;
info[4]=4;
info[5]=5;
info[6]=6;
write(fd[1],info,sizeof(info));
close(fd[1]);
delete info;
wait(NULL);
else if(p==0)
close(fd[1]);
int *inf=new int[7];
read(fd[0],inf,sizeof(inf));
for(int i=0;i<7;i++)
cout<<inf[i]<<endl;
close(fd[0]);
上述代码的输出是: 1 2 0 0 0 0 0。 有人可以告诉我我的错误是什么吗?如果信息数组在堆栈上,则问题已解决,但必须在堆上创建。
【问题讨论】:
sizeof(info)
-- 你认为这会有什么价值?
@PaulMcKenzie 7
好吧,那是你的错误。现在不是 7。
评论的重点是看看你在说sizeof(info)
时是否知道你在做什么。 info
是一个指针,它只知道这一点。
我已经解决了它而不是 sizeof(info) 我必须写 sizeof(info) *4,谢谢你的帮助
【参考方案1】:
您的代码中有两个错误。
第一个是这样的:
int *info=new int[7];
//..
write(fd[1],info,sizeof(info));
由于info
是int *
,sizeof(info)
与sizeof(int *)
相同,即指向整数的指针的大小。通常该值为 4 或 8。
要解决此问题,您需要说明要写入的字节总数,即sizeof(int) * 7
。你想写 7 个 int
大小的值,这是通过将 7 乘以 sizeof(int)
来计算的:
write(fd[1],info, sizeof(int) * 7);
您还说它适用于数组。请注意,指针不是数组,这就是为什么当您使用真正的数组而不是指针时会得到不同的结果。
第二个错误是您使用了错误的delete
形式。由于您使用的是new[]
,因此您应该使用delete[]
,而不是delete
。
【讨论】:
以上是关于在 C++ 中的写入系统调用中发送动态数组的问题的主要内容,如果未能解决你的问题,请参考以下文章