2015-06-26 5 views
1

После прохождения нескольких примеров передачи строки по значению в C, я до сих пор не понимаю, почему следующий код не работаетПередача строки по значению в C

int main(void){ 
    char *fileList; 
    strcpy(fileList,"This is a test line\n"); 
    char type = 'F'; 

    if(checkFileList(fileList, type)){ 
    printf("Proper File list\n"); 
    } 
    else{ 
    printf("Improper File list\n"); 
    } 

} 


int checkFileList(char *string, char type){ 
    // Do something with string 
} 

Эта программа работает, если я определить переменная FileList в основной функции как-

char fileList[128]; 

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

Что я здесь делаю неправильно? Обратите внимание, что я не хочу передавать строку по ссылке, поскольку я буду изменять строку в этой функции и не хочу, чтобы это отражалось в исходной строке.

+1

И только то, что «строка проход по значению»? Нет такой вещи в C. – Lundin

+0

Может быть, я не знаю правильной терминологии, но я бы хотел, чтобы вызываемая программа использовала копию строки, а не изменяла исходную –

+1

@gaurav, пожалуйста, не редактируйте и не изменяйте вопрос таким образом, который делает существующие аферы недействительными. Всегда *** добавьте *** обновление **, не удаляя ** оригинал. Надеюсь, я поняла. –

ответ

3

В коде

char *fileList; 
strcpy(fileList,"This is a test line\n"); 

вызывает undefined behaviour , так как, fileList используется неинициализированным.

Перед использованием необходимо выделить память fileList. Возможно, malloc() и семейство функций помогут вам в этом. Также читайте около free().

FWIW,

Эта программа работает, если я определить переменную FileList в основной функции как-
char fileList[128];

, потому что, то fileList массив здесь и выделение памяти уже сделанный компилятором. Таким образом, это нормально использовать.


КСТАТИ «Передача строки по значению» это неправильное использование терминов. C использует значение pass-by-value для любой передачи параметров функции.

0

Для того, чтобы выделить память для строки во время выполнения вы лучше узнать размер строки первой:

int main(void){ 
    const char *str = "This is a test line\n"; 
    int len = strlen(str); 
    char *fileList = malloc(len); 

    // then later you also have to take care for releasing the allocated memory: 
    free(fileList); 
} 
+0

Пожалуйста, посмотрите, почему не бросать] (http://stackoverflow.com/q/605845/2173917) возвращаемое значение 'malloc()' и family в 'C'. –

+0

Спасибо. Я не знал. – Matthias

+0

, вы можете избавиться от этого 'sizeof (char)', также, поскольку он гарантированно будет '1' в C. –

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