• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Помогите найти ошибку выхода за пределы выделенной памяти

  • Автор темы FlamedoFF
  • Дата начала
F

FlamedoFF

Помогите найти ошибку в следующем коде:
На этапе вхождения в функцию "vvod_vseh", а именно при вводе первой фамилии - выскакивает ошибка памяти. "Память не может быть written."
Как исправить?
[codebox]#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
struct abonent
{
char familiya[20];
int year, nomer[7], kolvo;
};
void vvod_vseh(abonent*, int);
void vivod_vseh(abonent*, int);
void sort(abonent*, int);
void vvod(abonent*, int, int);
void vivod(abonent*);
void vivod_s_opred_goda(abonent*, int, int);

void main(void)
{
int god, n, k;
abonent *p=0;
printf("Vvedite kol abonentov: \n");
scanf_s("%d",&n);
if(n<=0)
{
printf("Nevernoe kolichestvo!");
return;
}

vvod_vseh(p,n);

while(1)
{
puts("BBeduTe: 1-BblBOD, 2-COPTuPOBKA,");
puts("0-Exit. \n");
scanf_s("%d",&k);
if(!k)
break;
switch(k)
{
case 1: vivod(p);
break;
case 2: sort(p,0);
break;
}
printf("Vvedite god: \n");
scanf_s("%d",&god);

vivod_s_opred_goda(p, n, god);
}
}
void vvod(abonent*p)
{
printf("Lastname:\n");
scanf_s("%s",p->familiya);
printf("Year:\n");
scanf_s("%d",&p->year);
printf("Number:\n");
scanf_s("&s",p->nomer);
}

void vvod_vseh(abonent*p, int n)
{
for(int i=1;i<n;i++)
vvod(&p);
}

void vivod(abonent*p)
{
printf("%-20s%-20s%-15d\n", p->familiya, p->year, p->nomer);
}

void vivod_s_opred_goda(abonent*p, int n, int god)
{
int t;
for(int i=0;i<n;i++)
{
t=p.year;
if(t>=god)
{
vivod_vseh(&p,n);
}
}
}
void vivod_vseh(abonent*p, int n)
{
printf("%-20s%-20s%-15d\n", p->familiya, p->nomer, p->year);
}
void sort(abonent*p, int n)
{
int i,j,k;
abonent buf;
for(i=0;i<n;i++)
k=i;
for(j=i+1;j<n;j++)
{
if(_strcmpi(p[k].familiya,p[j].familiya)>0)
k=j;
buf=p;
p=p[k];
p[k]=buf;
}
}[/codebox]
 
E

European

Вы не выделили память для массива p
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!