首页 > 解决方案 > 当我尝试使用 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)

但这不起作用。

标签: carrayspointers

解决方案


在您显示的代码中,您有一个包含 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 的某种协议,就无法判断。


推荐阅读