Если у меня есть массив массива символов char *str[] = {"qwe", "asd", ..., "hello", "there" ,"pal"};
Как мне передать этот массив, но с определенным диапазоном функции (в частности, execv), например передать только «asd» до «hello»?
Я знаю, что вы можете передать что-то вроде str+1, чтобы пропустить первое. Это возможно?
Как вы говорите, вы можете передать указатель char **ptr, указывающий на запись "asd", и сказать N значений (так, чтобы ptr[N] указывал на "hello"). Однако вам нужно куда-то скопировать эти указатели, прежде чем использовать их с execv(), потому что для этого требуется список, заканчивающийся нулевым указателем. Или вам нужно разрешение, чтобы заменить "there" указателем NULL.
@bishop, который здесь не полностью применим, поскольку массив в этом вопросе не завершается дозорным.
Вы передаете str + start и целое число, указывающее длину диапазона. В C нет массивов переменной длины.
@sudo, конечно, в c есть массивы переменной длины. Их даже называют...*массивами переменной длины». И, как уже сказал Джонатан, execv* работает не так.
@AnttiHaapala «Массивы переменной длины» в C — это не то, что вы ожидаете от массивов переменной длины. Вы не можете передать их другим функциям и сообщить им длину, если только вы не используете часовой или что-то в этом роде.
@sudo это не вопрос. Это массивы, и их длина является переменной, и они называются массивами переменной длины.





Вы не можете сделать это для execv(), как сказано на странице руководства:
The list of arguments must be terminated by a null pointer, and, since these are
variadic functions, this pointer must be cast (char *) NULL.
Использование str в execv() похоже на следующий пример
void func1(char *str[])
{
for(int i=0; str[i]!=NULL; i++)
printf("%s:%s\n", __func__, str[i]);
}
Однако, если функция имеет объявление и использование, например:
void func2(char *str[], int n)
{
for(int i=0; i<n; i++)
printf("%s:%s\n", __func__, str[i]);
}
вы можете назвать это следующим образом, чтобы передать только «asd» до «hello».
func2(str+a, n);
//where str[a] is "asd" and str[a+n-1] is "hello"
Приведение относится к execl* не execv* функциям
Возможный дубликат Передать часть массива в качестве аргумента функции