c Различия в расположении строк? - PullRequest
3 голосов
/ 04 августа 2009

У меня есть функция, которая принимает char * в качестве единственного аргумента. Затем я выполняю некоторые операции над ним. Иногда это работает, а иногда нет. Это работает, зависит от того, как была построена строка. Например, вот два случая.

int main()
{
   char glob[] = "/abc/def/ghi";
   char *glob2 = "/abc/def/ghi";

   func(glob);  //this one works
   func(glob2); //this one doesnt work

   return 0;
}

В чем разница между двумя методами распределения и почему strtok взрывается при втором?

Ответы [ 4 ]

12 голосов
/ 04 августа 2009

strtok() в основном изменяет строку ввода.

char *glob2 = "/abc/def/ghi";

В вышеприведенном случае glob2 указывает на данные только для чтения, и, следовательно, они терпят неудачу, тогда как при 'char glob[] = "/abc/def/ghi";' данные не только для чтения, они доступны в массиве char. Следовательно, это позволяет модификации.

7 голосов
/ 04 августа 2009

char [] str1 = "foo" выделяет массив символов в стеке (при условии, что это внутри функции). Этот массив может быть изменен без проблем.

const char * str = "foo" дает вам указатель на строку foo, которая обычно находится в постоянной памяти.

char * str = "foo" сделает то же самое, но неявно удалит const (без фактического изменения факта, что указатель, скорее всего, указывает на постоянную память).

6 голосов
/ 04 августа 2009

Strtok записывает в память, выделенную для строки.

Вы не можете записывать в статически распределенную строковую память на большинстве компиляторов / сред выполнения / аппаратного обеспечения. Вы можете написать в стек.

0 голосов
/ 05 августа 2009

Другие комментарии верны; вы должны использовать вместо него strtok_r ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...