我遇到了问题。我想使用一个CopyString()
函数将const char*
和char*
复制到缓冲区。它不应该是一个问题,但由于某种原因,我的编译器没有做我期望它做的事情(我使用MikroC for 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数组中的数据不会在函数内发生变化,对吧?
编辑: 在这里使用&#39;整个&#39;进行编辑。示例代码(应该是Minimal,Complete和Verifiable示例)。 使用Keil编译器(我用它为ARM mcu编程)它编译得很好(就像我期望的那样)但是使用MikroC PIC编译器(据我所知,这就是编译器的调用方式。)它给出了以下错误:
18 384非法指针转换main.c (第18行,消息号384)
23 384非法指针转换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);
}
答案 0 :(得分:3)
这是一个与PIC控制器如何实现const变量有关的问题。在PIC控制器中,RAM和代码位于不同类型的存储器中。 RAM是SD-RAM,代码是闪存。(RAM可通过寄存器和RAM操作访问,代码只能自动解码,或通过复杂的汇编操作序列读取。)由于RAM非常小,const值为存储为代码存储器中的Return Literal指令(否则会绕过读取闪存的难度),这个指令更大。
因此,您无法对这两种类型执行相同的操作。这是你需要学会生活的东西。我建议你看看这段代码的反汇编,看看到底发生了什么。
答案 1 :(得分:2)
很久以前我在其他编译器中看过这个 - 注意我之前从未使用过这个编译器。
C的“数组是一个指针”概念会导致新手出现很多问题。为了防止这种情况,一些编译器编写者非常谨慎(这是一个词!查找它!)并要求您将字符的地址传递给const char *
而不仅仅是数组。
你能试试CopyString2(buf, &test[0], 3);
吗?
甚至CopyString2(buf, (const char *)&test[0], 3);
?