2015-09-13 3 views
1

Что случилось с этим?EXC_BAD_ACCESS при вызове printf()

int main(int argc, char** argv) { 

printf("%% "); 
size_t len; 
ssize_t read; 
char* line; 
int size; 

read = getline(&line, &len,stdin); 
printf("my name: %s\n",argv[0]); 
printf("%s",line); 
char* args[]= {"yoyoyo","hi","me",NULL}; 

return 0; 
} 

отладка показывает Исключение: EXC_BAD_ACCESS (код = 1, адрес = 0xa66647360)) на

Е ("мое имя:% s \ п", ARGV [0]); линия.

ответ

1

Вы забыли инициализировать значения, указанные в getline().

Попробуйте вместо char *line = NULL; и size_t len = 0;.

В справочной странице man 3 getline есть пример, который вы могли бы адаптировать.

0

Я подозреваю, что ваша проблема не связана с этой линией, но с этим:

read = getline(&line, &len,stdin); 

line объявлен как char * и не указал на что-нибудь. Таким образом, вы читаете данные в ячейке памяти неинициализированного указателя, поэтому вы получаете ошибку доступа.

Попробуйте статически выделения строки:

char line[256]; // or whatever line length you want 
read = getline(&line, &len, stdin); 

или с помощью таНос:

char *line = malloc(sizeof(char) * 256); 
read = getline(line, &len, stdin); 

но будьте осторожны перелива любой длины вы установили. Удачи!

+0

Нет, OP использует ['getline()'] (http://man7.org/linux/man-pages/man3/getline.3.html), функцию POSIX.1, а не ['fgets() '] (http://man7.org/linux/man-pages/man3/fgets.3.html). 'getline()' выполняет динамическое управление памятью, и вы должны дать ему указатель на указатель, указатель на выделенный размер и поток; проблема в том, что OP не инициализировал первые два значения должным образом. –

+0

Вы правы; поддержал ваш ответ. –

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