2012-08-05 26 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個字節的內存地址。