Как компилятор выделяет память для массива строк в C?

заставляют вас обслуживать это в вашем Mainifest

 <service
            android:name=".sys.service.youservice"
            android:exported="true"
        android:process=":ServiceProcess" />

, тогда ваша служба будет работать в другом процессе с именем ServiceProcess


, если вы хотите, чтобы ваша служба никогда не умирала:

  1. onStartCommand () return START_STICKY
  2. onDestroy () -> startself
  3. создать службу Deamon
  4. jin -> create процесс Native Deamon, вы можете найти некоторые проекты с открытым исходным кодом на github
  5. startForeground (), есть способ запуститьForeground без уведомления, google it
0
задан John Brown 6 March 2019 в 19:16
поделиться

2 ответа

strtok плохой гражданин.

Во-первых, он сохраняет состояние, которое вы неявно использовали при вызове strtok(NULL,...) - это состояние сохраняется в частной памяти библиотеки Standard C, что означает, что только однопоточные программы могут использовать strtok. Обратите внимание, что в некоторых библиотеках существует реентерабельная версия под названием strtok_r.

Для другого и для ответа на ваш вопрос, strtok изменяет свой ввод. Он не выделяет место для строк; он записывает NUL-символы вместо разделителя во входной строке и возвращает указатель на входную строку.

Вы правы, что strtok может вернуть более 10 результатов. Вы должны проверить это в своем коде, чтобы не писать после конца tokens. Надежная программа либо установит верхний предел, такой как ваш 10, и проверит его, сообщит об ошибке, если она превышена, либо динамически выделит массив tokens с помощью malloc, и realloc, если получит слишком много. большой. Тогда ошибка возникает, когда вам не хватает памяти.

Обратите внимание, что вы также можете обойти проблему strtok изменения входной строки с помощью strdup, перед ее передачей в strtok. Затем вам нужно будет освободить новую строку после того, как она и tokens, которые указывают на нее, выйдут из области видимости.

0
ответ дан Doug Currie 6 March 2019 в 19:16
поделиться

tokens это массив указателей.

Различие между строками и указателями, если часто нечеткое. В некоторых ситуациях строки лучше продумывать как массивы, в других - как указатели.

В любом случае ... в вашем примере input - это массив, а tokens - это массив указателей на место в пределах input.

Данные внутри input меняются при каждом вызове на strtok()

Итак, шаг за шагом

// input[] = "foo bar baz";
tokens[0] = strtok(input, " ");
// input[] = "foo\0bar baz";
//            ^-- tokens[0] points here
tokens[1] = strtok(NULL, " ");
// input[] = "foo\0bar\0baz";
//                 ^-- tokens[1] points here
tokens[2] = strtok(NULL, " ");
// input[] = "foo\0bar\0baz";
//                      ^-- tokens[2] points here
// next strtok returns NULL
0
ответ дан pmg 6 March 2019 в 19:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: