我的字符串文字发生了什么?

时间:2015-10-12 20:34:32

标签: c gcc gnu string-literals atmega

使用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];
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

此代码说明了您的问题:

#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