2017-01-03 29 views
-3

我必須始終執行我的函數。我無法使用標準庫。C++函數中的類型錯誤值始終爲NULL

My_cpy,my_len和my_strdup函數在這裏。請爲我檢查。我認爲這很容易,但我對這個功能有問題。我在頁面末尾顯示錯誤。我認爲這很清楚。另外這是C++

非常感謝。

代碼:

void my_cpy(char* dest, const char* src) { 

    int i = 0; 
    while (src[i] != '\0') { 
     dest[i] = src[i]; 
     i++; 
    } 
    dest[i] = '\0'; 
} 

int my_len(const char* p) { 

    int c = 0; 
    while (*p != '\0') 
    { 
     c++; 
     *p++; 
    } 
    return c; 
} 

char *my_strdup(const char *s) { 
    char* d = malloc(my_len(s) + 1); // Space for length + null 
    if (d == NULL) return NULL;   //No memory 
    my_cpy(d, s);      // Copy the characters 
    return d;       // Return the new string 
} 

我對這個功能的錯誤。我怎麼解決這個問題?

錯誤(有效)類型的值 「無效*」 不能被用於初始化 類型的實體 「字符*」

`Error C2440 'initializing': cannot convert from 'void *' to 'char *'` 

我寫:

char* d = (char*) malloc(my_len(s) + 1) 

但現在問題在p。始終爲NULL。

+0

這是C還是C++? –

+0

這是C++。也許以後我會用C –

+0

@UgurBaki從語法上講,這可能是C++,但它在風格上肯定不是C++。你爲什麼要模仿一個像'strdup'這樣的函數? 'std :: string'有什麼問題,或者如果你想學習一些東西,創建你自己的字符串類? – PaulMcKenzie

回答

0

malloc()正在返回void *類型。在C它並不需要轉換,但在C++中它需要顯式轉換:

char* d = static_cast<char*>(malloc(my_len(s) + 1)); 

(喜歡static_cast到C樣式轉換)

您還可以使用

char* d = new[my_len(s) + 1]; 

但是在這種情況下,您需要確保該函數的客戶端不會調用free(),而是調用delete[]

+0

static_cast與C cast相同。 – nikau6

+0

不,不是,@nikau。 C風格的演員比static_cast更強大。 –

+0

是的,我說的是,在這種情況下,這是一樣的。 – nikau6

相關問題