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

时间:2019-03-02 17:51:04

标签: c++ mbed

我正在尝试在“ 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 Hello2 World2

     

2 Hello2 World2

     

2 Hello2 World2

代替:

  

0 Hello0 World0

     

1个Hello1 World1

     

2 Hello2 World2

我知道这与const char *是指针这一事实有关,但是我不确定如何解决它。

我希望你们能帮助我。

谢谢!

1 个答案:

答案 0 :(得分:0)

在循环变量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不会尝试访问字符串。