将char *传递给c

时间:2016-06-13 10:48:03

标签: c

我遇到了问题。我想使用一个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);
}

2 个答案:

答案 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);