Следующий код работал отлично для меня (кодовые блоки 10.05) и не показывал ошибок времени компиляции/времени выполнения для различных тестовых случаев. Но показал ошибку времени выполнения, когда я отправил ее онлайн на веб-сайт программирования.
#include<stdio.h>
#include<stdlib.h>
/*
Here comes newPos()
*/
int main()
{
int t,i,n,k,j;
scanf("%d",&t);
int* a;
for(i=0;i<t;i++)
{
scanf("%d",&n);
free(a);
a=(int*) malloc(n);
for(j=0;j<n;j++)
scanf("%d",&a[j]);
scanf("%d",&k);
printf("%d\n",newPos(a,n,k));
}
return 0;
}
И затем я изменил его в.cpp файл после внесения нескольких изменений. т.е. вместо free (a) я использовал инструкцию, delete a; и вместо a = (int *) malloc (n), я использовал оператор a = new int [n]; Затем он успешно выполнен как на моем компиляторе, так и в Интернете.
Вы не выделяете достаточное количество памяти для хранения n
целых значений. Поэтому вам следует изменить:
a=(int*) malloc(n);
чтобы:
a=malloc(n * sizeof(int));
Я также удалил бросок, так как он бесполезен и мог скрывать забытые включения.
Вы не должны освобождать a
до выделения памяти. Освободите память только в конце цикла.
В комментариях этого ответа люди говорят о необходимости или не бросать, в частности в C++. В C вы не должны бросать.
Если вы хотите сделать код C++, вы должны использовать new
и delete
вместо malloc
и free
. Честно говоря, я не знаю, нужна ли трансляция в C++ при использовании malloc
, потому что в C++ я всегда использую new
. Но, пожалуйста, не пишите C-код с компилятором C++. Выбирайте между C и C++ в зависимости от ваших потребностей.
Вы освобождаете до выделения:
free(a); // This can lead to Undefined Behavior because a is containing some junk value
a=(int*) malloc(n);
Кроме того, нет особой необходимости использовать возвращаемый тип malloc и проверить свой аргумент malloc, вы не задаете размер в байтах правильно. Но в C++ требуется случай (поскольку вы отметили как C, так и C++).
a=(int*) malloc(n*sizeof(int));
Помимо упомянутой проблемы с размером размещения, вы не можете free(a)
если вы уже не присвоили что-либо, или инициализировали a
чтобы иметь значение NULL
.
Это связано с тем, что ваш аргумент malloc()
неверен. Функция не имеет понятия, какую "единицу" вы собираетесь использовать, поэтому единица для аргумента всегда "байты". С помощью оператора C++ new[]
, который работает на более высоком уровне в языке, поэтому он может учитывать размер шрифта.
Таким образом, измените выделение на:
a = malloc(n * sizeof *a);
Это удаляет бессмысленный и раздражающий приведение, а также добавляет отсутствующий sizeof
для масштабирования аргумента количеством байтов в каждом объекте с указателем. Это хорошая форма использования malloc()
для запоминания.
Также не free()
случайные указатели.
a
NULL
.