Передача String в качестве аргумента - получение segfault в функции - PullRequest
1 голос
/ 01 марта 2011

решено См. Нижнюю часть вопроса для решения.

У меня проблемы с передачей аргумента String моей функции, и я получаю ошибку сегментации при вызове функции.Программа принимает данные командной строки и передает файл, предоставленный функции, после проверки.

Мой код функции выглядит следующим образом:

char *inputFile; //
inputFile= argv[2];
strcpy(inputFile, argv[2]);
compress(inputFile){ 

//file open and creation work bug-free
//compression action to be written
void compress(char inputFile){
    //compression code here
}

Когда вызывается функция, возникает ошибкавыбрасывается, и значение inputFile равно 0x00000000, когда до вызова функции у него было место в памяти и значение пути к тестовому файлу.

Некоторые варианты, которые я пробовал, с соответствующими прототипами функций:

compress(char *inputFile)
compress (char inputFile[])

Я также изменил переменную.

Почему переменная с действительным адресом памяти и значением в отладчике внезапно стирается при использовании в качестве параметра?

Edit 1:

Включая предложения здесь, я удалил строку inputFile= argv[2], и отладчик показывает, что функция strcpy работает.

Однако я попробовали compress(char *inputFile) для Эдвина Бака и compress(argv[2]) для размотки, и оба изменения по-прежнему приводят к Cannot access memory at address 0xBEB9C74C

Странно то, что моя функция проверки файлов checkFile(char inputFile[]) работает со значением inputFile, но когдая пастот же параметр для функции compress(char inputFile[]), я получаю ошибку по умолчанию.

Edit 2- решено

Вы знаете, что что-то происходит, когда вы ставите своего профессора в тупик за 45минимумОказывается, я объявил буфер чтения файла как массив длиной 5 МБ внутри метода compress (), который, в свою очередь, максимально увеличил кадр стека.Замена объявления буфера на глобальную переменную сделала свое дело, и код выполняется.

Спасибо за помощь!

Ответы [ 3 ]

4 голосов
/ 01 марта 2011

Вы не должны писать в память, используемую для хранения argv[2].

Вы, кажется, не совсем понимаете, как представлены строки;вы копируете как указатель (с присваиванием), так и действительные символы (с strcpy()).

Вы должны просто сделать compress(argv[2]);, как только вы убедились, что этот аргумент действителен.

2 голосов
/ 01 марта 2011

Во-первых, чтобы скопировать что-то из argv[2] в другое место, вам нужно немного памяти для "этого где-то еще".Вы можете выделить память, основываясь на размере argv[2], но для нашего простого примера подойдет очень большой буфер фиксированного размера.

char inputfile[2048];

Похоже, вы пытались сделать это оператором присваивания,который на самом деле не делает то, что вы хотели.

// this is not the way to what you seek, as it doesn't create any new memory for inputfile
char* inputfile = argv[2];

при передаче переменной inputfile в процедуру, вы хотите передать гораздо больше, чем один символ, поэтому void compress(char inputfile) не вариант.Это оставляет

compress(char *inputFile)  // I prefer this one
compress (char inputFile[])

, которые оба работают, но по моему опыту первое предпочтительнее, так как некоторые старые компиляторы имеют тенденцию делать различия между семантикой указателя и массива.У этих компиляторов нет проблем с приведением массива к указателю (что требуется как часть спецификации языка C);однако приведение указателя на массив в таких системах становится немного беспорядочным.

0 голосов
/ 01 марта 2011

Вы не выделили память для использования char *. Все, что вы сделали с char * inputfile - это указатель.

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