Intereting Posts
Как преобразовать «2012-03-02» в эпоху unix в C? Почему переменные-члены структуры не могут быть изменены в функции? последовательность фибоначчи с использованием общей памяти в C Как проверить, является ли параметр интегральным постоянным выражением в макросе препроцессора C? что такое char i = 0x80 и почему переполнение не произошло при смещении битов возможное присвоение в условии (C) Сколько символов может быть в массиве символов? printf игнорирует одиночную обратную косую черту ‘\’ Как сохранить строку в указателе символа? Как сделать инкрементное резервное копирование для SQLite? Есть ли библиотека C с открытым исходным кодом (а не c ++) для разработки драйверов Windows? Что означает спецификатор формата% * s? Факториал в C без условностей, циклов и арифметических операторов C – Вставка в связанный список в порядке возрастания как хранить двоичную строку в двоичной форме в файле?

Параметр повторного использования strtol

Этот код работает как ожидалось, заполняет массив чисел, используя один указатель

#include  #include  #include  int main(void) { int arr[4], count = 0, i; char *p, s[32] = " \t 10, 15 \n ,20, 25 , "; p = s; do { arr[count++] = (int)strtol(p, &p, 10); while (isspace(*p) || *p == ',') p++; } while (*p); for (i = 0; i < count; i++) { printf("%d\n", arr[i]); } return 0; } 

Мой вопрос:

Можно использовать p как param1 (source) и & p как param 2 (адрес первого недопустимого символа) в strtol?

    Да, это безопасно.

    Дополнительную информацию об использовании см. В http://en.cppreference.com/w/cpp/string/byte/strtol . Строка 11 примера иллюстрирует вызов с использованием той же переменной для 1-го и 2-го параметров.

    Да, это безопасно. Первый аргумент передается значением, поэтому strtol имеет локальную копию, на которую не влияют изменения, записанные во второй параметр.

    Да, это верно, поскольку вы сохраняете указатель на начало строки (указатель s). Подумайте, что у вас есть такая ситуация:

     #include  #include  #include  #include  int main(void) { int arr[4], count = 0, i; char *p, *s; s = (char*)malloc(sizeof(char) * 15); strcpy(s, " \t 10, 15 \n ,20, 25 , "); p = s; do { arr[count++] = (int)strtol(p, &p, 10); while (isspace(*p) || *p == ',') p++; } while (*p); for (i = 0; i < count; i++) { printf("%d\n", arr[i]); } free(s); return 0; } 

    strtol переместит p-указатель куда-нибудь в строку. Если вы позвоните free(p) вас будет утечка памяти (если она не сработает). Но поскольку вы сохраняете указатель s, вы всегда сможете освободить занятую память.