2012-01-14 64 views
2

我需要一個char *傳遞給一個函數,但這個函數確實需要const如何將動態數組(malloced)傳遞給函數?

但我從文件中讀取它和它的動態對我來說:

fseek(fcode, 0, SEEK_END); 
i=ftell(fcode); 
square_scm = (char*) malloc(i); 
//free(square_scm); 
fseek(fcode, 0, SEEK_SET); 
fread(square_scm, 1, i, fcode); 
scheme_load_string(sc, square_scm); 

所以square_scm這裏是:

"(display 
    (string-append "Answer: " 
    (number->string (square 6.480740698407859)) "\n"))юоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюо" 

沒有自由:

"(display 
    (string-append "Answer: " 
    (number->string (square 6.480740698407859)) "\n"))ННээээ««««««««««««««««ю" 

我怎麼能使它像char [size],如:

"(display 
    (string-append "Answer: " 
    (number->string (square 6.480740698407859)) "\n"))" 

+2

爲什麼在分配後立即釋放'square_scm'? – Mysticial 2012-01-14 20:21:52

+0

哦...這是測試,我沒有免費的Tresh。添加到問題,免費評論。 – Cynede 2012-01-14 20:24:16

+2

事實上,你的問題只是你分配一個'char'太少,然後不能零終止你的字符串。沒有比這更平庸的了。使用C來處理字符串是諺語中的痛苦! – 2012-01-14 20:35:03

回答

2

不要釋放malloced內存,直到完成它。爲了回答您的問題,請始終在字符串中留出終止空字節的空間,並將最後一個字節設置爲空字節。

fseek(fcode, 0, SEEK_END); 
i=ftell(fcode); 

//allocate for null byte too 
square_scm = malloc(i + 1); 

//reset the memory before using it 
memset(square_scm, 0, i + 1); 

fseek(fcode, 0, SEEK_SET); 
fread(square_scm, 1, i, fcode); 
square_scm[i] = 0; //not really required as we have already memset it 
scheme_load_string(sc, square_scm); 

//now you should free it, assuming it is not used anymore 
free(square_scm); 
+0

這不是C++,所以沒有必要施放'malloc'。 – 2012-01-14 20:30:50

+0

謝謝:)它的工作原理 – Cynede 2012-01-14 20:31:41

+0

@Alex無需投射malloc? – Cynede 2012-01-14 20:32:40

4

free()是一場災難;您只需要完成數據的free()

您應該錯誤地檢查返回碼,至少應該是malloc()fread()

從文件中讀取的數據將不被空終止。您需要按照一個字節進行過度分配,並在將數據讀入分配的緩衝區後添加終端NUL('\0')。 (請注意,打開文件後文件可能會縮小;請注意從fread()返回的值,如果文件增加,則不會看到額外的數據,但不會發生其他損壞)。

您問約const。據推測,該功能square_cm()有一個簽名,例如:

void square_cm(SomeType *sc, const char *data_string); 

,你是擔心你有一個char *,而不是在你的代碼調用一個const char *

你不需要去關注;編譯器會爲您添加constconst實際上是對您(函數的用戶)的承諾,即函數本身不會修改您的數據。它可以採用固定字符串(例如字符串常量)或動態分配的字符串,這並不重要。遇到問題的地方是當你有一個const char *或你需要傳遞給一個函數的字符串文字時,它需要一個char *。這裏的功能並不明顯地承諾將字符串留在一起,這可能會導致問題。例如,不能將字符串文字傳遞給strtok(),因爲該函數試圖修改字符串,但該字符串可能位於只讀內存中,這會觸發問題(Unix上的核心轉儲;無處不在的行爲)。

所以,const在函數簽名功能的承諾,給消費者(用戶)不改變的東西。您可以將const或非const數據傳遞給該函數,因爲它不會被任何方式修改。

2
  1. 您正在使用一個釋放指針,導致未定義的行爲。您應該刪除或移動free()呼叫。
  2. 你從文件中讀取後,你是不是空終止字符串。你應該終止該字符串。喜歡的東西:

    square_scm[i] = 0; 
    

    確認您已經分配了足夠的空間以允許空終止 - 這意味着將+1malloc()電話。

    或者,你可以最大字段寬度添加到您的通話printf()

    printf("%*s", i, string); 
    

    你們雖然沒有顯示在打印發生的代碼,這樣可能會或可能是不實際的。

你或許應該也做一些錯誤檢查。

+0

with square_scm [i] = 0; 「(顯示爲 \t(string-append」答案:「 \t(number-> string(square 6.480740698407859))」\ n「))НН」 - 文件中沒有HH :( – Cynede 2012-01-14 20:26:25

+0

聽起來像你的'ftell() '告訴你的謊言,正如我提到的 - 你可能想要做一些錯誤檢查,'fread'會返回一個簡短的對象數量,也許你想在這種情況下更新'i' .... – 2012-01-14 20:28:04