使用GNU cc 4.8.1编译Atmega64。我的字符串文字不见了。我正在尝试将帧从Atmega64 UARt中推出,除来自全局数组的有效载荷(中间的10个字节)外,所有帧都将其推出。如果我写入全局数组

array[0] = 'H';
array[1] = 'e';
array[2] = 'l';
array[3] = 'l';
array[4] = 'o';


这使它脱离了UART。但是,如果我使用字符串文字char *array = "Hello";,然后将此指针传递给memcpy(),尽管帧的页眉/页脚部分确实这样做,但该文本永远不会移出UART。我只是在有效载荷/消息应该出现的地方得到垃圾。字符串文字发生了什么,编译器是否由于某种原因而将其吹走了?我用一个函数填充数组,然后立即调用另一个构建UART框架的函数,将全局数组的内容复制到输出数组中。

这是将字符串文字复制到全局数组中的函数。

char screen[4][11]

display(void)
{
    char *strpt;

    LCDmemcpy(1, "stuff");  //doesn't work
    strpt = "blah";
    LCDmemcpy(2, strpt); //doesn't work either
}

void LCDmemcpy(char seg, char *buff)
{
    u8 i;

//  if(seg<5 && seg>0)
    {
        //memcpy(&screen[seg-1][0], buff, 11);
        for(i=0; i<11; i++)
        {
            screen[seg-1][i] = buff[i];
        }
    }
}

最佳答案

当在函数调用中用作参数时,数组的名称会衰减为指向第一个元素的指针。这将允许为其分配文字(衰减为相同类型),它不会修改原始数组(因为指针是通过值传递的),但不会修改指针参数的值...

此代码说明了您的问题:

#include <stdio.h>

void confusing(char array[])
{
    char* literal = "Hallo";
    array = literal;
    printf("%s - now array points to literal...not...\n", array);
}

int main(void)
{
    char myArray[] = "xyz";
    confusing(myArray);
    printf("%s - as expected, no change here\n", myArray);
    return 0;
}


输出:

Hallo - now array points to literal...not...
xyz - as expected, no change here

10-04 10:37
查看更多