2013-09-26 64 views
0

我的目標是讀取文件並將其內容存儲在char數組中,並給定要讀取的偏移量和字節數。我寫了一個相同的功能,它工作正常。malloc函數如何在C中工作?

現在這個函數是從別的地方調用的。所以我試圖聲明一個變量char * data,它將保存上述函數返回的內容。聲明後我試圖分配一些內存。 (我知道多少,因爲我指定了要讀取的字節數)。它去如下:

char * data; 
char * filename = "alphabet.txt"; 
int data_size = 10; 
printf("data size: %d\n", data_size); 
data = (char*) malloc (data_size); 
printf("Size allocated to data: %d\n",sizeof(data)); 
return 0; 

該代碼給出了以下的輸出:

data size: 10 
Size allocated to data: 8 

我不理解這種行爲。有人可以請我解釋一下。

非常感謝

shahensha

+5

「malloc函數如何在C中工作?」 - 不,「運營商的規模如何在C工作?」 – 2013-09-26 19:31:27

+0

[只有返回的指針才能獲取malloc的大小](http://stackoverflow.com/questions/12131925/getting-the-size-of-a-malloc-only-with-the-returned-指針) – 2013-09-26 19:32:04

+1

在'c'中,你不應該把malloc的返回值轉換爲'(char *)'。您可以毫無問題地將void指針指定給它。 –

回答

3

這有什麼好做malloc

sizeof在編譯時做它的事情,而不是運行時。 sizeof(data)sizeof(char*)相同。您的程序在編譯時無法知道指針指向多少內存。

另一方面,sizeof(some_array)將按預期工作,因爲在編譯時已知數組大小。

+0

啊!我明白了,我在這裏做了什麼。感謝您的快速回復。所以,我正確使用malloc,對吧?我應該簡單地調用read_file函數,然後......好嗎? – shahensha

+0

@Shahensha「我正確使用malloc,對嗎?」 - 不完全 - [看到這個](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858)。 – 2013-09-26 19:38:56

+0

@Shahensha另外,'printf(「%d」,sizeof(stuff));'是未定義的行爲 - 'sizeof'運算符產生一個'size_t'類型的對象,它將使用'%zu'轉換來打印符。 – 2013-09-26 19:39:57

0

sizeofchar *ptr會給出sizeof指針地址ptr的指向。它的變化取決於機器。

char *ptr = malloc(10); malloc will allocate the 10 space and ptr pointing 
     to the starting address. 

檢查下面的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main() 
{ 
char * data; 
int data_size = 10; 
printf("data size: %d\n", data_size); 
data = malloc ((data_size+1)*sizeof(char)); 
strcpy(data, "datadatada"); 
printf("string lenght: %d\n",strlen(data)); 
printf("Size allocated to data: %zd\n",sizeof(data)); 
return 0; 
} 
+1

你有一個錯誤的錯誤(終止'NUL'字節沒有空間),並且你錯誤地指定了'malloc()'的返回值。你也使用'%d'來打印'size_t',這是未定義的行爲。 – 2013-09-26 19:45:05

0

只是這兩行代碼

char * data; 
printf("Size allocated to data: %d\n",sizeof(data)); 

將打印(在OP的機器):

Size allocated to data: 8 

sizeof返回大小的論點,這裏是data指針。它在編譯時完成。

mallocsizeof(data)無關。

0

顯然你對sizeof的行爲做了一些完全沒有根據的假設。顯然你認爲sizeof可以用來查詢malloc -ed內存塊的大小。

不可能。 sizeof與此無關。實際上,C庫不會爲您提供任何方法來確定malloc -ed內存塊的大小。這根本不可能。如果你想知道你分配了多少內存,你必須設計自己的方式來記住你從malloc請求了多少內存。故事結束。

sizeof評估爲其操作數的大小。在這種情況下,您提供了一個指針作爲其操作數,因此它評估的是指針的大小,在您的平臺上恰好爲8