fgets "Запись о нарушении прав доступа 0xCCCCCCCC." ошибка
Error: Unhandled exception at 0x60092A8D (msvcr110d.dll) in C_Son60.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC.
При выполнении кода ниже приведен код ошибки.(Успешно компилируется) Где моя ошибка?
#include <stdio.h>
int i;
int main(void){
char *names[3];
//get the names of the cities
puts("Enter names of cities");
for (i = 0; i < 3; i++)
{
fgets( names[i], 99, stdin);
}
//print entered names
for (i = 0; i < 3; i++)
{
printf("%s", *names[i]);
}
getch();
}
3 ответа
Решение
2 вещи:
- вам нужно выделить строки, которые вы создали - вы можете сделать это с
malloc(100 * sizeof(char))
- при печати вы делаете
*names[i]
что значит -**(names + i)
,
все, что тебе нужно names[i]
используйте код:
#include <stdio.h>
int i;
int main(void){
char *names[3];
//get the names of the cities
puts("Enter names of cities");
for (i = 0; i < 3; i++)
{
names[i] = (char *)malloc(100 * sizeof(char));
fgets( names[i], 99, stdin);
}
//print entered names
for (i = 0; i < 3; i++)
{
printf("%s", names[i]);
}
getch();
}
Вам нужно выделить память, на которую указывают указатели на символы, прежде чем читать их в
например:
for (i = 0; i < 3; i++)
{
names[i] = malloc(200);
fgets( names[i], 99, stdin);
}
Вы должны выделить свою память, прежде чем что-то хранить в ней. Когда вам нужно выделить массив элементов, и вы не знаете количество элементов во время компиляции, вы должны использовать malloc()
выделить их.
Не забудь free
Ваша динамически выделенная память позже, чтобы избежать утечек памяти!