2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 СИ: чтение строки в функции посимвольно
Сообщение02.12.2017, 18:33 
Здравствуйте. Имеется код
Код:
#include <stdio.h>
#include <stdlib.h>

struct list {
   char * s;
   struct list * prev, * next;
} * a;

unsigned long int i;
char q;

int read()
{
   i = 0;
   char c;
   while ((c = getchar()) == '\n')
   {
      (*a).s[i] = c;
      i++;
   }
   (*a).s[i] = '\0';
   return i;
}

void readlist()
{
    a = malloc(sizeof(struct list));
    a = NULL;
    i = read();
    //остальной код, до которого исполняющий файл не доходит
}

int main()
{
    do
    {
        switch (z)
        {
            case 0: readlist(); break;
            case 1: ; break;
            case 2: ; break;
            case 3: ; break;
            case 4: ; break;
            case 5: ; break;
            case 6: ; break;
            case 7: ; break;
            case 8: ; break;
            case 9: ; break;
            case 10: ; break;
            case 11: ; break;
        }
    }
    while (z < 12);
    return 0;
}


Компилируется нормально (Windows 10, Code::blocks, GCC). После запуска ввожу 0. После этого исполняющий файл вылетает на функции read() либо в месте, где стоит условие, либо где присваивание. В чём ошибка? Изначально вместо
Код:
(*a).s
стояло
Код:
a->s
, также было выделение памяти
Код:
(*a).s = malloc(sizeof(char) * 1000)
, вместо
Код:
c = getchar()
было
Код:
scanf("%c", &c)
. Три с лишним часа бьюсь, прога как вылетала, так и продолжает вылетать.

 
 
 
 Re: СИ: чтение строки в функции посимвольно
Сообщение02.12.2017, 18:39 
А это вот зачем?!
Код:
    a = NULL;
Получили указатель на память и сразу же его обнулили, но память по нулевому адресу вам не принадлежит и писать туда нельзя.

 
 
 
 Re: СИ: чтение строки в функции посимвольно
Сообщение02.12.2017, 19:06 
Dmitriy40 в сообщении #1271132 писал(а):
А это вот зачем?!
Код:
    a = NULL;
Получили указатель на память и сразу же его обнулили, но память по нулевому адресу вам не принадлежит и писать туда нельзя.

Хорошо, обнуление убрал. Но программа вылетает, при всех тех же случаях, о которых я писал.

-- 02.12.2017, 21:10 --

Dmitriy40 в сообщении #1271132 писал(а):
А это вот зачем?!
Код:
    a = NULL;
Получили указатель на память и сразу же его обнулили, но память по нулевому адресу вам не принадлежит и писать туда нельзя.

хотя, добавил
Код:
(*a).s = malloc(sizeof(char) * 1000)
и она заработала. Спасибо большое!

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group