0

每当我想使用 C 读取或写入二进制文件时,我都会使用fread()andfwrite()函数。他们需要正在读取或写入的数据字节作为参数,因此我使用该sizeof()函数。现在的问题是:

书上说我应该声明一个这样的函数:

fread(&variable,sizeof(TYPE_OF_VAR),quantity,file);

我使用了以下语句,它在大多数情况下都有效,但并非总是如此:

fread(&variable,sizeof(VARIABLE),quantity,file);  

为什么它有时有效但有时无效?
它是否取决于变量的类型(int、char 等)
这是否取决于我使用的数据量?

4

3 回答 3

2

要记住的是,这sizeof是基于编译器在编译时对类型的了解(暂时忽略 VLA)。如果给它一个变量,它将使用该变量的类型。

所以,我唯一能想到它不能像你期望的那样工作的地方是使用指针

基本上它归结为:

int x[5];
int *y = &x[0];
int *p = malloc(sizeof(int) * 5);
sizeof(x); // == sizeof(int) * 5
sizeof(y); // == sizeof(int *)
sizeof(p); // == sizeof(int *)

这在处理函数时会变得很棘手,因为数组在传递给函数时会衰减为指针。另请注意,所有这 3 个都是完全等价的:

int func(int *p);
int func(int p[5]);
int func(int p[]);

在所有 3 中, p 是一个指针,而不是一个数组。

于 2012-08-05T22:37:14.447 回答
1

有关堆与堆栈的讨论,请参阅此堆栈溢出问题:堆栈和堆是什么以及在哪里

sizeof()在堆元素上,如指针,将返回指针的大小,而不是指针可以存储的元素数。

但是,sizeof()在堆栈元素上:数组或const char *将返回数组或字符串的长度。

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

#define LENGTH 100

int main(int argc, char *argv[])
{
    char *a = NULL;
    char b[10] = "abcdefghi";

    printf("sizeof(b): %zu\n", sizeof(b));

    a = malloc(LENGTH + 1);
    if (a) {
        *(a + LENGTH) = '\0';
        memset(a, ' ', LENGTH);
        fprintf(stdout, "a (before memcpy):\t[%s]\n", a);
        printf("sizeof(a), before: %zu\n", sizeof(a));
        memcpy(a, b, sizeof(b) - 1);
        fprintf(stdout, "a (after memcpy):\t[%s]\n", a);
        printf("sizeof(a), after: %zu\n", sizeof(a));
        free(a);
    }

    return EXIT_SUCCESS;
}

编译:

$ gcc -Wall sizeofTest.c -o sizeofTest

输出:

$ ./sizeofTest
sizeof(b): 10
a (before memcpy):     [                                                                                                    ]
sizeof(a), before: 8
a (after memcpy):      [abcdefghi                                                                                           ]
sizeof(a), after: 8

在我的平台上,achar *指向占用 8 个字节的内存地址。

于 2012-08-05T22:42:11.610 回答
0

它会一直有效。

int main()
{
    char a[10];
    int b[10];
    printf("%d %d %d %d %d %d",sizeof(char),sizeof(int), sizeof(a),sizeof(b), sizeof(a[0]), sizeof(b[0]) );
}

试试上面的代码。您应该看到(取决于编译器,我的 char 为 1 字节,整数为 4 字节)1,4,10,40,1,4

fread 或 fwrite 或您使用它的任何地方都没有什么不同。

于 2012-08-05T22:38:52.040 回答