2015-07-11 3 views
1
#include <stdio.h> 
#include <stdlib.h> 


void getline(char *line, int lim) 
{ 
    int len = 0; 
    char c; 
    while (len < lim) 
    { 
     if ((c=getchar()) != EOF && c != '\n') 
     { 
      *line++ = c; 
      printf("reading %c\n", c); 
      len++; 
     } 
     else 
      break; 
    } 

    *line = '\0'; 
} 


int main() 
{ 
    char (*lines)[500]; // pointer to array with 500 chars 
    char *linetwo[4]; //why doesnt this work???? array of 4 pointers. 


    getline(*lines, 500); 
    getline(*linetwo, 500); // !!!!ERROR!!! 

    printf("%s", *lines); 

    system("PAUSE"); 
    return 0; 

} 

У меня возникли проблемы с этим кодом. Я хочу четыре строки ввода с каждой строкой, имеющей максимум 500 символов. Я написал функцию getline, чтобы сохранить ее в указателе char *. Однако getline дает ошибку при инициализации массива указателей.Передача массива указателей в функцию

Единственная разница между (*lines)[500] и *lines[4], по-моему, не указывает ни количество строк, ни количество символов в строке.

Пожалуйста, помогите мне понять, почему передача * linetwo в getline после * linetwo [4] инициализация дает ошибку.

+0

Вы разыменование два * неопределенных * указателей, отправляя результаты в функцию, ожидающую действительную память о которой писать. Таким образом, программа вызывается * неопределенным поведением * в каждом случае, когда '* lines' или' * linetwo' отображаются в виде выражений. – WhozCraig

+0

@WhozCraig Я не совсем понимаю ваш комментарий :(Я новичок, так что вы можете рассказать, что это значит разыменовать два неопределенных указателя? – deNsuh

+0

@BLUEPIXY Как они неправильны? – deNsuh

ответ

3

Ваши указатели не указывают на anyt hing, но вы используете их, как будто они это делают. Это ближе к тому, что вам, вероятно, понадобится.

int main() 
{ 
    char (*lines)[500] = malloc(sizeof *lines); 
    char *linetwo[4] = { malloc(500) }; // other three pointers will be NULL 

    getline(*lines, sizeof *lines); 
    getline(*linetwo, 500); // or linetwo[0] 

    printf("%s", *lines); 
    system("PAUSE"); 

    free(lines); 
    free(linetwo[0]); 
    return 0;  
} 

Примечание: проверка ошибок не выполняется выше. Используйте по своему усмотрению. Также обратите внимание, что ваш getline может конфликтовать с библиотечной функцией POSIX getline, что является совсем другой проблемой.

+0

большое спасибо! Теперь я получаю идею выделения памяти и разыменования и т. Д. :) – deNsuh

+0

@deNsuh, пока вы понимаете разницу между указателем на массив длины N ('lines' в вашем коде) и массивом длины N указателей ('linetwo' в вашем коде), вы, вероятно, будете в порядке. Его препятствие для начинающих программистов C. Держись! Не сдавайся. – WhozCraig

+0

Не новичок, но все еще учащийся. Я думал, что две объявления 'char' были синонимами (кроме' 500' и ​​'4'). Но когда я печатаю 'sizeof' каждый, они' 4' и '16'. –

0
char * lines[10]; 

Объявляет и выделяет массив указателей на char. Каждый элемент должен разыменоваться отдельно.

char (* lines)[10]; /* invalid until assigned or malloc'ed) */ 

Объявляет (без выделения) указатель на массив char ('с). Указатель должен быть разыменован для доступа к значению каждого элемента .

0

Чтобы передать массив указателей в функции просто передать имя массива без использования «*»

и что меняет вашу декларацию функции с

void getline(char *line[], int lim) 

и колл с

getline(linetwo, 500); 

Это самый простой способ сделать это

0
void getline(char *line, int lim) 

Эта функция ожидает указатель.

Вы передаете массив указателя на него (*linetwo[4]). Таким образом, дайте ошибку.

Чтобы передать *linetwo[4] передать это вы можете сделать это

void getline(char **line, int lim) 
Смежные вопросы