Могу ли я использовать указатель в качестве параметра получает в C? - PullRequest
1 голос
/ 12 марта 2020

Я изучаю язык C.

Когда я передаю указатель на gets (), я нахожу, что он может хорошо работать.

char *ptr;
gets(ptr);
puts(ptr);

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

char *ptr[4];
int i=0;
for(i=0;i<4;++i)
    gets(ptr[i]);
for(i=0;i<4;++i)
    puts(ptr[i]);

Они разные или первая часть неверна на самом деле? Я хочу знать причину.

Ответы [ 3 ]

1 голос
/ 12 марта 2020

Указатель должен сначала указывать куда-то.

#define BUFSIZE 100

char *ptr = malloc(BUFSIZE);
fgets(stdin, ptr, BUFSIZE);
puts(ptr);

char *ptr[4];
int i=0;
for(i=0;i<4;++i) {
    ptr[i] = malloc(BUFSIZE);
    fgets(ptr[i], BUFSIZE, stdin);
}
for(i=0;i<4;++i) {
    puts(ptr[i]);
}
1 голос
/ 12 марта 2020

Вы передаете указатель на функцию (например, gets()), которая записывает данные в область памяти, указанную вашим указателем. В вашем случае у вас есть указатель неинициализированный , который означает, что он указывает на случайную область памяти (где находятся приложения или операционная система). Это приводит к случайным последствиям - от «работы» до ненормального завершения или зависания. Вам необходимо зарезервировать память и назначить указатель на нее, например:

char *ptr = (char*)malloc(256);

gets(ptr);
puts(ptr);

free(ptr);

Рассмотрите возможность использования gets_s(), который является более безопасным.

1 голос
/ 12 марта 2020
char *ptr[4];
int i=0;
for(i=0;i<4;++i)
    gets(ptr[i]);

Это недопустимый код C, поскольку вы не выделили место для ptr[i]. С другой стороны, никогда не используйте gets, потому что это функция, которая не проверяет ограничение буфера.

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