[英]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.