UNIX C send()错误号14
我有以下代码:UNIX C send()错误号14,c,sockets,pointers,unix,errno,C,Sockets,Pointers,Unix,Errno,我有以下代码: void caller() { char buffer[20][20]; int sd; ... send(sd, buffer[7], 5, 0); } void funct(int sd, char **buffer) { send(sd, buffer[7], 5, 0); } void caller() { char buffer[20][20]; int sd; ... funct(sd, buf
void caller()
{
char buffer[20][20];
int sd;
...
send(sd, buffer[7], 5, 0);
}
void funct(int sd, char **buffer)
{
send(sd, buffer[7], 5, 0);
}
void caller()
{
char buffer[20][20];
int sd;
...
funct(sd, buffer);
}
现在我有了这个代码:
void caller()
{
char buffer[20][20];
int sd;
...
send(sd, buffer[7], 5, 0);
}
void funct(int sd, char **buffer)
{
send(sd, buffer[7], 5, 0);
}
void caller()
{
char buffer[20][20];
int sd;
...
funct(sd, buffer);
}
简化假设,而不是。。。我对套接字UDP进行了初始化,并与服务器建立了连接,使用send而不是sendto。
我不明白为什么第二个代码在发送错误时生成,并且errno设置为值14,但是第一个代码工作得很好。调用
funct(sd,buffer)时有任何警告代码>?您可能会得到main.c:24:11:警告:从不兼容的指针类型[-Wincompatible指针类型]
传递'funct'的参数2。您能否将char[20][20]
传递给需要char**
的函数?在第一个代码片段中,buffer[20][20]
和buffer[7]
出现在相同的上下文中,因此编译器知道buffer
是一个数组,其中每个元素都是20个字符的数组。在第二个代码段中,函数参数是指向char的指针。这也可能是指向char的指针数组,但它肯定不是数组数组数组。您可以将参数声明为char(*buffer)[20]
@ABC我假定您的意思是char(*buffer)[20]
可以工作。它工作的原因是,该声明告诉编译器buffer
是指向20个字符数组的指针。这允许编译器正确地进行地址计算。例如,buffer[7]
的计算是address=buffer+7*20
。通过将地址向前移动140字节,跳过数组的前7行。为了进行该计算,编译器需要数字20。声明char(*buffer)[20]
包含编译器需要的信息。您还可以将参数声明为char buffer[][20]
。这对你来说可能更容易理解和记住。将2D数组声明为参数时,编译器需要列数(以便计算地址)。它不需要行数,因此可以将行保留为空。当然,您可以指定行数,比如charbuffer[20][20]
。但是编译器将忽略行数。