数组正在填充最后一个元素

时间:2017-02-16 10:24:43

标签: c arrays string pointers char

我正在尝试填充一个数组(char *)。

当我填充数组时,我进行打印以显示元素,这是正常的。

但是,在那之后,当我尝试使用数组时(在main()函数中),总是填充最后一个元素。

typedef struct Device {
char *adr_mac;
char *rssi;
} Device; 

Device * devices[6];
int array_length = 6;

void *changeRssi( void *tab)
{
int h = 0;
srand(time(NULL));

int rssi = 0;
char ch[2] = "";

while(1){
   sleep(10);
printf("\n\n  $$$ Changing RSSI of devices ...\n\n");
for (h = 0; h < array_length; h++)
{

    rssi = generate_rssi(10,99);
    sprintf(ch, "%d", rssi);
    devices[h] -> rssi = ch;
    printf("new rssi = %s\n\n", devices[h] -> rssi);
}  
}

}

1 个答案:

答案 0 :(得分:1)

这里有两件事要提。

首先,看来,您的char值需要两个sprintf() s(范围10-99),但对于C11,您需要提供一个大小为2的缓冲区,所以你只需要一个元素,或者换句话说,就数组边界而言,你是一个元素。

根据sprintf(),章节§7.21.6.6,devices[h] -> rssi = ch;定义

  

[....]写入空字符   在写的字符的末尾; [...]

但是,在你的情况下,空间不存在,所以发生数组边界溢出,调用undefined behavior

解决方案:你需要一个3号的数组。

第二次:如果是ch这样的声明,则devices[h] -> rssi的内容不会复制到devices[h] -> rssi,而是ch指向ch。在这种情况下,devices[h] -> rssi是一个局部变量,在函数返回时超出范围,因此以后对malloc()的任何访问都将是无效的内存访问,这将再次导致UB。

解决方案:您需要使用devices[h] -> rssi等分配器函数和ch系列分配内存,并复制strdup()的内容,或者使用{{1}}。