为什么许多C函数需要其中一个参数的大小?

时间:2017-05-20 14:59:36

标签: c pointers

让我们说我们有以下功能:

char buffer[BUFFER_LENGTH];
//...
struct sockaddr_in cli_addr;
socklen_t clilen = sizeof(cli_addr);
int newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
read(newsockfd, buffer, 255);

为什么这些函数需要其中一个参数的长度?是不是可以只使用sizeof运算符并删除长度参数?例如;

int accept(int socketfd, struc sockaddr * socketaddr) {
    int sockaddrlen = sizeof(*sockaddr); // sizeof sockaddr instance in memory
    // rest of the function
}

void read(int fd, char* buffer) {
    int messageLength = sizeof(*buffer);
    // rest of the function
}

或者,改为这样:

void read(int fd, char* buffer) {
    read(fd, buffer, sizeof(*buffer);
}

这不可能吗?为什么不呢?

1 个答案:

答案 0 :(得分:4)

因为(至少在C中)数组被衰减为指针(特别是作为参数传递时)。

因此,当您对sizeof(*buffer)进行编码时,您的意思与sizeof(char)相同,根据定义,它是1。

C与C ++不同;在真正的C ++中,你几乎从不使用原始数组(但是containers),例如,你会将std::vector<char>& vc传递给你假设的read(然后,你会使用vc.size()在里面)。

请注意,C(但不是C ++)接受flexible array members。你当然可以系统地使用它们编写一个库(并采用一些关于通过struct中的某个非最后成员获得分配大小的约定 - 以这样一个灵活的数组成员结束)....

BTW sizeof始终是常量(即使对于struct - 以灵活的数组成员结束),除非应用于VLA - s