在 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));

由于infoint *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++ 中的写入系统调用中发送动态数组的问题的主要内容,如果未能解决你的问题,请参考以下文章

C#调用C++的dll库怎么传递结构体中不定长度的char数组

C++ 将数组写入注册表中的二进制条目

C++ 中的静态数组与动态数组

C++中的动态数组声明

C++ 动态内存分配与结构中的数组

在 C++ 中的 2D 动态内存分配数组中释放分配的内存