Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中将char*传递给const char*_C - Fatal编程技术网

在c中将char*传递给const char*

在c中将char*传递给const char*,c,C,我有个问题。我想使用一个CopyString()函数将const char*s和char*s复制到缓冲区。这应该不是问题,但由于某种原因,我的编译器没有完成我期望它完成的事情(我使用MikroC for PIC pro) 很久以前,我在其他编译器中见过这种情况——请注意,我以前从未使用过这种编译器 C的“数组是指针”概念给新手带来了很多问题。为了防止这种情况发生,一些编译器编写人员非常挑剔(这是一个单词!查找!),要求您将字符的地址传递给const char*,而不仅仅是一个数组 你能试试Cop

我有个问题。我想使用一个
CopyString()
函数将
const char*
s和
char*
s复制到缓冲区。这应该不是问题,但由于某种原因,我的编译器没有完成我期望它完成的事情(我使用MikroC for PIC pro)


很久以前,我在其他编译器中见过这种情况——请注意,我以前从未使用过这种编译器

C的“数组是指针”概念给新手带来了很多问题。为了防止这种情况发生,一些编译器编写人员非常挑剔(这是一个单词!查找!),要求您将字符的地址传递给
const char*
,而不仅仅是一个数组

你能试试CopyString2(buf,&test[0],3)吗


甚至
CopyString2(buf,(const char*)和test[0],3)

很久以前,我在其他编译器中见过这种情况-注意,我以前从未使用过这种编译器

C的“数组是指针”概念给新手带来了很多问题。为了防止这种情况发生,一些编译器编写人员非常挑剔(这是一个单词!查找!),要求您将字符的地址传递给
const char*
,而不仅仅是一个数组

你能试试CopyString2(buf,&test[0],3)吗


甚至
CopyString2(buf,(const char*)和test[0],3)

这是一个与PIC控制器如何实现常量变量有关的问题。在PIC控制器中,RAM和代码位于不同类型的内存中。RAM是SD-RAM,代码是闪存。(RAM可以通过寄存器和RAM操作访问,代码只能自动解码,或通过复杂的汇编操作序列读取。)由于RAM非常小,常量值作为返回文字指令存储在代码内存中(以绕过读取闪存的困难),这是更大的


因此,你不能对这两种类型都执行相同的操作。这是你需要学会的。我建议你看看这段代码的反汇编,看看到底发生了什么。

这是一个与PIC控制器如何实现常量变量有关的问题。在PIC控制器中,RAM和代码位于不同类型的m中RAM是SD-RAM,代码是闪存。(RAM可以通过寄存器和RAM操作访问,代码只能自动解码或通过复杂的汇编操作序列读取。)由于RAM非常小,常量值作为返回文字指令存储在代码内存中(以绕过读取闪存的困难),这是更大的


因此,您不能对这两种类型都执行相同的操作。这是您需要学会接受的。我建议您查看此代码的反汇编,看看到底发生了什么。

发布您的实际代码。您的示例不完整(请参阅)。此外,如果您遇到编译错误,请发布完整的错误消息。
buf
是如何声明的?请提供a,否则问题可能会被否决或关闭。您显示的程序是有效的C程序,但IIRC微芯片C编译器的标准不是最新的,这可能会导致问题。您可能需要se使其在不同的编译器上工作。您在字符串末尾传递的是空格而不是null。因为您提供了正确的长度,所以应该可以,但这不是好的做法。发布实际代码。您的示例不完整(请参阅)。此外,如果您遇到编译错误,请发布完整的错误消息。
buf
是如何声明的?请提供a,否则问题可能会被否决或关闭。您显示的程序是有效的C程序,但IIRC微芯片C编译器的标准不是最新的,这可能会导致问题。您可能需要se使其在不同的编译器上工作。您在字符串末尾传递的是空格而不是null。因为您提供了正确的长度,所以应该可以,但这不是一个好的做法。您的第一个建议确实导致了与前一个建议相同的错误。由于某些奇怪的原因,您的第二个建议没有传递正确的指针。您的第一个建议确实导致了与前一个建议相同的错误。出于某种奇怪的原因,您的第二个建议没有传递正确的指针。@Toby,尽管edaboard线程是要将常量char*传递给一个需要char*的函数。在这种情况下,我可以得到字符串首先需要复制到RAM,因为该函数可能需要字符串不是常量。但我的问题是将char*传递给接受const char*的函数。我看不出这样一个函数为什么不接受char*。无论如何,谢谢你的回答!@SurDin我相信这是mcu世界中经常发生的事情:常量只存储在闪存中。我相信这不会发生如果有编译器不这样做,我也会使用Keil(arm)编译器不会对作为const char*参数传递的char*产生任何问题,尽管它仍然只在闪存中存储const char*。为什么PIC会有所不同?可能是因为这两种类型的内存都需要不同的内存访问序列。对我来说仍然没有多大意义。但是无论如何,谢谢你的回答!在PIC中没有命令可以从flash读取,当它从flash读取常量时,它会执行一个“调用”命令并获取W寄存器中的值。当它读取字符数组时,有一个不同的命令用于读取间接。这些是非常不同类型的汇编指令。这种类型的功能需要重载函数。通常,您可以从处理器中的RAM映射地址从闪存中读取,这样做不会出现问题。好的,Thanks SurDin!一定是这样。@Toby虽然edaboard线程是要将常量char*传递给需要char*的函数。在这种情况下,我可以得到字符串首先需要复制到RAM中,因为
 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)
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);
}