2017-10-14 112 views
0

很抱歉,如果這個問題是基本的,但我真的不明白爲什麼,如果我不添加「+ 1」節目不打印所有的字母試圖瞭解如何做的realloc和malloc函數工作

a = realloc(a,sizeof(char)*(i + 1));

以及在這裏

*(A + I)= letra;

「a」的位置在每次通過時是否變大? 我認爲情況並非如此,但我不太確定。

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

char *copiarFrase(); 

int main() 
{ 
    char *frase; 
    frase = copiarFrase(); 
    printf("Frase: %s", frase); 
    free(frase); 
    return 0; 
} 


char *copiarFrase() 
{ 
    FILE *archivo; 
    char letra; 
    char *a; 
    int i = 0; 
    archivo = fopen("frases.txt", "r"); 
    a = malloc(sizeof(char)); 
    letra = fgetc(archivo); 
    while(letra != EOF) 
    { 
     *(a + i) = letra; 
     i++; 
     a = realloc(a, sizeof(char)*(i + 1)); 
     letra = fgetc(archivo); 
    } 
    return a; 
} 
+0

你需要知道的唯一真實的事情是這個代碼是多麼可怕,可怕,致命的錯誤。谷歌「realloc o(n)複雜性」找到正確的命中。 –

+0

這看起來像是一個關於c字符串的問題,而不是'malloc'或'realloc'。如果你把'char'數組作爲一個字符串,它必須是'NUL'終止的。 'printf(「%s」);'將繼續打印字符,直到找到一個'\ 0''字符。所以如果你有字符串「Hello」,你實際上需要6個字符來表示字符串(5個字母加上'NUL'終止符)。這就是爲什麼你在爲字符串指定的內存分配上看到+1的原因。 – yano

回答

0

總之,你的代碼確實是一次一個文件1字節讀取和寫入連續什麼讀取到內存中新的地方。

這些步驟如下:

分配存儲1個字節(8位),用於一個字符存儲該文件的內容:

a = malloc(sizeof(char)); 

注:由於這不是爲整個文件提供足夠的內存,您的程序會不斷重新分配,每次循環1個字節(以下更多評論)。

打開一個文件流:

archivo = fopen("frases.txt", "r"); 

從該流讀取檔案館的第一個字母(frases.txt):

letra = fgetc(archivo); 

開始循環讀取到文件結束(EOF):

while(letra != EOF) 
{ 
    *(a + i) = letra; 

這會將從fgetc()中讀取的信複製到您的指針a - 這 - >*(a + i)是指針算術。它實質上是指從內存地址a引用內存中的地址i字節。只要*a沒有(+ i)會寫信到你的記憶開始(字符指針)。

你的主要問題:

爲什麼(i + 1)a = realloc(a, sizeof(char)*(i + 1));

realloc()創建請求的大小和複印輸入緩衝器的新的空間,這可能是爲什麼@hans critized代碼(與您一次讀取整個文件一個字符的事實一起)的新內存。稍微改進就是一次讀取1024個字符,然後重新分配。要詳細瞭解如何從文件中讀取字符,請研究堆棧溢出或谷歌。

別忘了,i在此代碼中一直遞增1:i++

例如,如果您已經閱讀您的文件"hola mundo"到您的緩衝區a,然後i將有10價值。 realloc()在內存中創建一個全新的地方。因此,如果您分配了10個字節,那麼對於"hola mundo"和終止NULL字節:'\0'來說就足夠了,但對於下一個字節'!''\0'字節不足。因此,您需要爲下一個char分配i(NULL字節的當前長度+1)的內存+ 1