Внутри цикла for: преобразование текста и int в const char * и переход к функции - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь преобразовать некоторый текст плюс int в const char * внутри цикла for, а затем передать этот 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 голосов
/ 02 марта 2019

На каждой итерации переменных цикла 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 уничтожена (вышла из области видимости).

...