Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UNIX C send()错误号14_C_Sockets_Pointers_Unix_Errno - Fatal编程技术网

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]
。但是编译器将忽略行数。