我正在尝试将一些文本加一个int转换为“for循环”中的const char *,然后将此const char *传递给库中的函数(HTTPClient - mbed)。 (函数库中的函数只接受const char *作为参数,它只是将const char *值添加到数组中,稍后使用HTTP POST发送这些值)。
这是我的代码:
for (int i = 0; i < 3; i++) {
char buf1[16];
char buf2[16];
char buf3[16];
sprintf(buf1,"%d",i);
sprintf(buf2,"Hello%d",i);
sprintf(buf3,"World%d",i);
const char* value1 = buf1;
const char* value2 = buf2;
const char* value3 = buf3;
map.put("id[]", value1);
map.put("test1[]", value2);
map.put("test2[]", value3);
}
但似乎在每个循环中都会覆盖这些值,因此在执行HTTP POST时会发送以下值:
2 Hello2 World2
2 Hello2 World2
2 Hello2 World2
代替:
0 Hello World
1 Hello1 World1
2 Hello2 World2
我知道这与const char *是指针这一事实有关,但我不知道如何修复它。
我希望你们能帮助我。
谢谢!
在循环变量的每次迭代中,bufN
都会被创建和销毁,但它们恰好在堆栈上的相同地址处创建(否则循环会耗尽堆栈空间)。
看起来map.put
不会复制字符串而是存储指向字符串的指针,你的bufN
变量会在每次迭代时被新值覆盖,这就是你看到最后写入值的原因。
另请注意,循环终止后bufN
变量不再存在,因此存储在map
中的指针变为无效。事实恰恰相反,这个记忆没有被其他东西覆盖。
修复方法是为所有缓冲区分配空间,例如:
constexpr int N = 3;
char bufs[N][3][16];
for(int i = 0; i < N; ++i) {
snprintf(bufs[i][0], sizeof bufs[i][0], "%d", i);
snprintf(bufs[i][1], sizeof bufs[i][1], "Hello%d", i);
snprintf(bufs[i][2], sizeof bufs[i][2], "World%d", i);
map.put("id[]", bufs[i][0]);
map.put("test1[]", bufs[i][1]);
map.put("test2[]", bufs[i][2]);
}
在map
变量被销毁(超出范围)之后,您需要确保bufs
不会尝试访问字符串。