配列(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);
}
}
}
ここで言及することが2つあります。
まず、rssi
値は2char
秒(範囲10〜99)かかるように見えますが、の場合sprintf()
、サイズ2のバッファーを指定しているため、1つの要素が不足しています。つまり、オフです。配列の境界に関して1つずつ。
あたりとしてC11
、章§7.21.6.6、sprintf()
定義
[....]書き込まれた文字の最後にヌル文字が書き込まれます。[...]
ただし、あなたの場合、スペースがないため、配列境界のオーバーランが発生し、未定義の動作が発生します。
解決策:サイズ3の配列が必要になります。
2番目:のようなステートメントの場合devices[h] -> rssi = ch;
、の内容ch
はにコピーされずdevices[h] -> rssi
、むしろをdevices[h] -> rssi
指しch
ます。この場合、ch
ローカル変数であるため、関数が戻るとスコープ外になるため、それ以降のアクセスdevices[h] -> rssi
は無効なメモリアクセスになり、これもUBの原因になります。
解決策:malloc()
やファミリなどのアロケータ関数を使用してメモリを割り当てdevices[h] -> rssi
、の内容をコピーするch
必要がありますstrdup()
。または、を使用します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加