c - 当我尝试使用 strncpy 将一个数组缓冲区复制到另一个数组缓冲区时,为什么会出现不兼容的指针类型错误?
问题描述
我正在尝试将一个char*
缓冲区复制到另一个char*
缓冲区。但是当我尝试使用以下方法执行以下操作时,strncpy
我收到一条错误消息passing argument 1 of 'strncpy' from incompatible pointer type
struct context {
char* name[200];
};
void r_msg(context **ctx) {
char* buffer[200];
while(1) {
ssize_t r = recv(socket_fd, buffer,200, 0);
if(r > 0) {
strncpy((**ctx.name), buffer, 200);
}
}
}
为什么我会收到此错误?我怎么能复制buffer
进去name
?我也试过
strcpy((**ctx.name), buffer)
但这不起作用。
解决方案
在您显示的代码中,您有一个包含 200个字符指针的数组是没有意义的。
至于您的问题,对于任何指针或数组a
,则*a
等于a[0]
. char
现在,如果您有一个指向(like ctx.name
)的指针数组,**ctx.name
则等于ctx.name[0][0]
which 将是一个char
.
首先要解决这两个问题,您应该将数组更改为不是指针数组,而是普通数组char
:
char name[200];
和
char buffer[200];
然后,当您复制时,您将指针传递给name
数组的第一个元素:
strncpy(&ctx.name[0], buffer, 200);
或者,你让数组衰减到那个指针:
strncpy(ctx.name, buffer, 200);
另请注意,实际上不需要临时buffer
数组或复制,您可以recv
直接写入ctx.name
数组:
ssize_t r = recv(socket_fd, ctx.name, sizeof ctx.name - 1, 0);
if (r > 0)
ctx.name[r] = '\0';
请注意长度参数的更改,并且我添加了代码以确保缓冲区作为字符串终止(因为我不知道接收到的数据是否会终止)。
您还应该进行一些适当的错误检查(何时r <= 0
)来处理它。
此外,如果套接字是 TCP 套接字,那么您需要知道 TCP 是没有消息边界或数据包的流协议。远程端的单个send
可能会被拆分,因此您需要recv
多次拆分。或者多个send
呼叫可以合并并通过一个recv
呼叫接收。如果没有基于 TCP 的某种协议,就无法判断。
推荐阅读
- vba - VB Round函数改变小数点分隔符
- conda - 多个 conda 安装效率更高吗?
- tshark - 需要从 PCAP 中提取数据,但只获得对话的一方面
- python - 如何在for循环中从列表中添加字典值
- database - 在 MongoDB 中,您可以将来自不同集合的两个索引组合在一起吗?
- java - Java DefaultTreeModel 的 removeNodeFromParent 正在删除不正确的节点
- routes - 如何检查用于调用页面/组件的路由?
- flutter - 地理定位器包不起作用,颤振
- typescript - NestJS 使用 .env 和 @nestjs/config 设置 TypeOrm 连接
- react-native - 如何在 React Native 中使用 Firebase 实现 Microsoft 登录?