2012-08-05 74 views
0

每当我想使用C读取或写入二进制文件,我确实使用fread()fwrite()函数。它们需要作为参数读取或写入数据的字节,因此我使用sizeof()函数。现在的问题是:sizeof(var)总是在C中工作吗?

这些书说我应该声明这样的功能:

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

我已经用下面的语句,其工作的大部分时间,但并不总是:

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

它为什么有时有效,但有时它不?
是否这取决于型可变(INT,炭等)
它依赖于数量,我用数据的

+0

请您发表一个当这不起作用的例子,包括源代码? – 2012-08-05 22:36:33

+1

它在标识符(变量)用于对象时起作用;当标识符是指向对象的指针时它不起作用。 – pmg 2012-08-05 22:37:51

+1

'sizeof'应用于括号中的类型,给出了类型的大小。应用于表达式时,不带括号,它给出了表达式类型的大小。 – 2012-08-05 22:46:21

回答

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为指针,不是阵列。

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])); 
} 

试试上面的代码。您应该看到(取决于编译器,该矿拥有焦炭为1个字节和整数4个字节)1,4,10,40,1,4

这不是FREAD或FWRITE或任何你使用它的不同。

1

查看堆栈溢出问题讨论堆堆栈:What and where are the stack and heap。上堆元件

sizeof(),如指针,将返回指针的大小,元件,该指针可以存储的数量不限。

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

#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 

在我的平台,char *点,占用8个字节的内存地址。