Проблема с переносом массива int в argv[] для функции execv

Нужно передать массив переменной длины как аргумент вызываемой программы. Для этого использую функцию execv, т.к. там как раз аргументы передаются как массив указателей. Массив указателей формирую следующим образом:

char** argv = (char**)malloc(sizeof(char*)*(size+2));//size - размер int массива
argv[0] = "prog";
char buf [3];
for ( int j = 1; j < size+1; j++)
{
    sprintf(buf, "%d", array[(first + j - 1)]);//first - смещение в исходном int массиве
    argv[j] = buf;
}
argv[size+1] = NULL;
execv("prog", argv);

Проблема заключается в том, что в массив argv на место всех элементов числового массива записывается последний элемент этого массива, то есть: был числовой массив 1 4 3 5 7 6, а вызываемая программа получила массив 6 6 6 6 6 6. Вызываемая программа точно работает правильно, проблема именно в передаче в argv


Ответы (1 шт):

Автор решения: Harry

Ну сами подумайте!

sprintf(buf, "%d", array[(first + j - 1)]); 
argv[j] = buf;

Все ваши argv хранят один и тот же адрес - buf! Который вы каждый раз перезаписываете.

Воспользуйтесь массивом типа

char buf[количество аргументов][максимальная длина];

Ну, или динамически размещаемым - типа

argv[j] = malloc(...)
sprintf(argv[j]...

Кстати, у вас же C++ - так почему malloc, а не new&?...

→ Ссылка