2014-12-11 2 views
2

Я работаю над разбиением строк.Различия между объявлением строки массива и указателем

Когда я запускаю этот код, у меня есть ошибка (Bus error: 10 на Mac OS или SegFault на Linux).

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char *str = (char *)malloc(1000*sizeof(char)); 
    str ="- This, a sample string."; 
    char * pch; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    pch = strtok (str," ,.-"); 
    while (pch != NULL) 
    { 
    printf ("%s\n",pch); 
    pch = strtok (NULL, " ,.-"); 
    } 
    return 0; 
} 

Когда я изменить декларацию по ул char str[] ="- This, a sample string."; он работает хорошо.

Может ли кто-нибудь сказать мне, почему? Мой мозг тает.

+2

Почему вы называете 'malloc', если вы не используете его возвращаемое значение? – rightfold

+0

Это был простой пример: для реальной вещи требуется вернуть значение. – peletloick

+1

Просьба опустить избыточный код из ваших примеров. Они только сбивают с толку. – rightfold

ответ

2

С man page из strtok()

Будьте осторожны при использовании этих функций. Если вы их используете, обратите внимание, что:

  • Эти функции изменяют свой первый аргумент.

  • Эти функции не могут использоваться для постоянных строк.

Как ваш код, str имеет базовый адрес статически размещенную строку буквального, которая обычно только для чтения.

В вашем коде, измените

char *str = (char *)malloc(1000*sizeof(char)); 
str ="- This, a sample string."; 

в

char *str = malloc(1000); 
strcpy(str, "- This, a sample string."); 

Кроме того, первое выделение памяти str с помощью malloc(), а затем assignning строкового литерала str будет перезаписать ранее выделенным память возвращается malloc(), что приводит к утечке памяти.

Далее

char str[] ="- This, a sample string."; 

это хорошо работает, потому что здесь вы инициализация местный array и это containts является изменяемой.

Примечание:

Пожалуйста do not cast возвращаемое значение malloc().

2

Да, потому что strtok может изменить исходную строку. Однако ваша исходная строка

str ="- This, a sample string."; 

не может быть изменен, так как это строковый литерал.

делает также malloc, а затем:

str ="- This, a sample string."; 

не имеет никакого смысла, потому что вы теряете указатель, возвращающий таНос и создание утечки памяти.

Если вы создаете строку, как это (как вы упомянули):

char str[] ="- This, a sample string."; 

Содержание этой строки может быть изменен, так strtok хорошо с ним.

Смежные вопросы