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 вещи:

  1. вам нужно выделить строки, которые вы создали - вы можете сделать это с malloc(100 * sizeof(char))
  2. при печати вы делаете *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 Ваша динамически выделенная память позже, чтобы избежать утечек памяти!

Другие вопросы по тегам