将带符号的char数组传递给函数期望const char指针会导致数组乱码

时间:2015-11-13 15:28:23

标签: c arrays parameters char parameter-passing

我似乎无法理解这里发生的事情:

我有一个函数可以计算两个日期之间的差异,以秒为单位。然后它被四位移位以产生一些输出:

void GetUTC(unsigned char buffer[5])
{
    struct tm str_time;
    time_t start;
    time_t current = time(NULL);
    str_time.tm_year = 2010 - 1900;
    str_time.tm_mon = 1;
    str_time.tm_mday = 1;
    str_time.tm_hour = 0;
    str_time.tm_min = 0;
    str_time.tm_sec = 0;
    str_time.tm_isdst = 0;
    start = mktime(&str_time);

    printf("%s\n",ctime(&start));
    printf("%s\n\n",ctime(&current));

    uint32_t someInt = difftime(current,start);
    buffer[0] = 2;
    buffer[1] = (someInt & 0xff);
    someInt = someInt >> 8;
    buffer[2] = (someInt & 0xff);
    someInt = someInt >> 8;
    buffer[3] = someInt;
    someInt = someInt >> 8;
    buffer[4] = (10 & 0xff);
}

我把这个数组喂它:

    unsigned char toWrite[5];

然后叫它

    GetUTC(toWrite);

一切顺利。现在,我有一个函数,我正在尝试将新数组输入,它采用以下参数:

void gatt_write_attribute(GDBusProxy *proxy, const char *arg)

我称之为:

gatt_write_attribute(someProxy, toWrite);

然而,我传递给函数gatt_write_attribute的数组显示它是混乱的垃圾:$2\20023\n23而不是我期望的toWrite值。 (数字不同,因为它与时间有关):

[0]: 2
[1]: 23
[2]: 54
[3]: 128
[4]: 10

我尝试在\0的末尾添加终止toWrite,但它没有改变任何内容。我尝试将其转换为const char指针,但也没有。

我觉得我错过了一个非常简单的细节。有人可以解释为什么我不能将这个char数组传递给gatt_write_attribute函数吗?

2 个答案:

答案 0 :(得分:0)

正如Ian AbbottChux在我原始问题的评论中所指出的那样,我确实很傻,并没有意识到我的调试器正在显示被指向为字符数组的东西数字。这就是导致错误值的原因。

我应该允许自己在工作时间之间多睡一会儿。

答案 1 :(得分:-1)

您需要将数组作为指针传递给第一个函数。否则它只会被复制到堆栈并且函数会写入新副本。垃圾可能在那里,因为它还没有被初始化。