gpt4 book ai didi

c - 当我尝试使用 strncpy 将一个数组缓冲区复制到另一个数组缓冲区时,为什么会出现不兼容的指针类型错误?

转载 作者:行者123 更新时间:2023-11-30 14:32:28 24 4
gpt4 key购买 nike

我正在尝试将一个 char* 缓冲区复制到另一个 char* 缓冲区。但是,当我尝试使用 strncpy 执行以下操作时,我收到一条错误消息:passing argument 1 of 'strncpy' from incompromedpointer 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 的指针数组(如 ctx.name )然后 **ctx.name等于ctx.name[0][0]这将是一个 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 是没有消息边界或数据包的流式协议(protocol)。单send远程端可能会被分割,因此您需要 recv多次。 多个send调用可以合并并通过一个 recv 接收称呼。如果没有 TCP 之上的某种协议(protocol),就无法判断。

关于c - 当我尝试使用 strncpy 将一个数组缓冲区复制到另一个数组缓冲区时,为什么会出现不兼容的指针类型错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59799847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com