簡體   English   中英

將char *傳遞給c中的const char *

[英]Pass char* to const char* in c

我有問題 我想使用一個CopyString()函數將const char*char*復制到緩沖區。 這應該不成問題,但是由於某種原因,我的編譯器沒有執行我期望的操作(我將MikroC用於PIC pro)。

 void CopyString(char * dest, const char * src, uint8 maxLength){
    uint8 i;
    for(i=0 ; src[i] && ( i < maxLength ) ; i++){
        dest[i] = src[i];
    };
}   

char test[3]={'2', '0', ' '};
CopyString(buf, test, 3);//gives an error (illigal pointer conversion)
CopyString(buf, (const char *)test, 3); //Doesn't pass the pointer to the array... No idea why not... Do you?

void CopyString2(char * dest, char * src, uint8 maxLength){
    uint8 i;
    for(i=0 ; src[i] && ( i < maxLength ) ; i++){
        dest[i] = src[i];
    };
}   
const char test[3]={'2', '0', ' '};
CopyString2(buf, "20 ", 3);//All ok
CopyString2(buf, test, 3); //gives an error (illigal pointer conversion)

有人知道該怎么做嗎? 目前,我在一個C文檔中使用CopyString2()CopyString()看起來不太好,因此不需要。 為什么將char*傳遞給const char*帶來問題? const char*唯一要做的就是確保char數組中的數據在函數內不會改變,對嗎?

編輯:這里是帶有“完整”示例代碼的編輯(應為最小,完整和可驗證的示例)。 使用Keil編譯器(我用來為ARM mcu編程)時,它可以很好地編譯(就像我期望的那樣),但是使用MikroC PIC編譯器(據我所知,這就是編譯器的調用方式。),它將產生以下錯誤:

18384非法的指針轉換main.c(第18行,消息號384)

23384非法的指針轉換main.c(第23行,消息號384)

void CopyString(char * dest, const char * src, unsigned char maxLength){
    unsigned char i;
    for(i=0 ; src[i] && ( i < maxLength ) ; i++){
        dest[i] = src[i];
    };
}   

void CopyString2(char * dest, char * src, unsigned char maxLength){
    unsigned char i;
    for(i=0 ; src[i] && ( i < maxLength ) ; i++){
        dest[i] = src[i];
    };
}   

void main(){
    char buf[16]={0,};
    char test1[3]={'2', '0', ' '};
    const char test2[3]={'2', '0', ' '};

    CopyString(buf, test1, 3);//gives an error (illigal pointer conversion);
    CopyString(buf, (const char *)test1, 3); //Doesn't pass the pointer to the array

    CopyString2(buf, "20 ", 3);//All ok
    CopyString2(buf, test2, 3); //gives an error (illigal pointer conversion);
}

這是與如何為PIC控制器實現const變量有關的問題。 在PIC控制器中,RAM和代碼位於不同類型的存儲器中。 RAM是SD-RAM,代碼是閃存。(可通過寄存器和ram操作訪問RAM,並且代碼只能自動解碼,或通過復雜的匯編操作序列讀取。)由於RAM很小,因此const值是作為Return Literal指令存儲在代碼存儲器中(以避開否則讀取Flash存儲器的難度),該值較大。

因此,您不能真正對兩種類型執行相同的操作。 這是您需要學習生活的東西。 我建議您看一下這段代碼的反匯編,以了解實際情況。

我很久以前就在其他編譯器中看到過這一點-請注意,我以前從未使用過此編譯器。

C的“數組是指針”概念引起新手的很多問題。 為避免這種情況,一些編譯器編寫者感到非常惱火(這是一個詞!查找它!),並要求您將字符的地址傳遞給const char *而不是數組。

你可以嘗試CopyString2(buf, &test[0], 3);

甚至是CopyString2(buf, (const char *)&test[0], 3);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM