内部 for 循环:将文本和 int 转换为 const char* 并传递给函数

Inside for loop: Convert text and int to const char* and pass to function

本文关键字:char const 函数 转换 循环 for 文本 int 内部      更新时间:2023-10-16

我正在尝试在"for 循环"中将一些文本加上一个 int 转换为 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

你好

2世界2 2你好

2世界2 2你好

2世界2

而不是:

0

你好0 世界0

1你好

1世界1 2你好

2世界2

我知道这与 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