让我们说我们有以下功能:
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);
}
这不可能吗?为什么不呢?
答案 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