gpt4 book ai didi

c - 数组已填充最后一个元素

转载 作者:行者123 更新时间:2023-11-30 15:00:12 25 4
gpt4 key购买 nike

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

}

最佳答案

这里有两件事需要提及。

首先,看来,您的rssi值需要两个char(范围10-99),但是,对于sprintf (),您提供了一个大小为 2 的缓冲区,因此您缺少一个元素,或者换句话说,您在数组边界方面偏离了一个元素。

根据 C11 第 §7.21.6.6 章,sprintf() 定义

[....]A null character is written at the end of the characters written; [...]

但是,在您的情况下,空间不存在,因此会发生数组边界溢出,从而调用 undefined behavior .

解决方案:您需要一个大小为 3 的数组。

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

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

关于c - 数组已填充最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42271158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com