我正在尝试填充一个数组(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);
}
}
}
答案 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}}。