在`fwrite()`中同时具有参数大小和nmemb的目的是什么?

use*_*739 5 c fwrite

fwrite() 被声明为这样。

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
Run Code Online (Sandbox Code Playgroud)

但实际写入的字节数只是 size * nmemb。那么为什么不只指定字节数呢?为什么需要同时指定 size 和 nmemb?谢谢。

Kur*_*ato -1

https://chromium.googlesource.com/chromiumos/third_party/glibc/+/cvs/libc-970216/stdio/fwrite.c

正如您在不同的 fwrite 实现中看到的(不仅在上面的链接中),返回的答案是return (size_t) written / size;。因此,成功后您将获得返回值nmemb

例子:

#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>

int main() {

    int num = 2;
    uint64_t *arr = malloc(num * sizeof(uint64_t));
    arr[0] = (uint64_t)'a' ^ (uint64_t)'b' << 8 ^ (uint64_t)'c' << 16;
    arr[1] = (uint64_t)'d' ^ (uint64_t)'e' << 8 ^ (uint64_t)'f' << 16;

    size_t writed_size = 0;
    writed_size = fwrite(arr, sizeof(arr), num, stdout);
    if (writed_size == num) {
        printf(" : Success\n");
    }

    writed_size = fwrite(arr, 1, sizeof(arr) * num, stdout);
    if (writed_size == sizeof(arr) * num) {
        printf(" : Success\n");
    }
    writed_size = fwrite(arr, sizeof(arr) * num, 1, stdout);
    if (writed_size == 1) {
        printf(" : Success\n");
    }

    free(arr);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

感谢@Eric Postpischil 纠正我之前的答案。