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

0

Следующий код работал отлично для меня (кодовые блоки 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]; Затем он успешно выполнен как на моем компиляторе, так и в Интернете.

  • 5
    На первой итерации вы освобождаете висячий указатель. Инициализировать в a NULL .
  • 3
    Как вы узнали, «работает для меня»! = «Без ошибок». Это очень важный урок для программистов на C или C ++.
Показать ещё 4 комментария
Теги:

4 ответа

6
Лучший ответ

Первая ошибка:

Вы не выделяете достаточное количество памяти для хранения n целых значений. Поэтому вам следует изменить:

a=(int*) malloc(n);

чтобы:

a=malloc(n * sizeof(int)); 

Я также удалил бросок, так как он бесполезен и мог скрывать забытые включения.

Вторая ошибка:

Вы не должны освобождать a до выделения памяти. Освободите память только в конце цикла.

C/C++ смесь:

В комментариях этого ответа люди говорят о необходимости или не бросать, в частности в C++. В C вы не должны бросать.

Если вы хотите сделать код C++, вы должны использовать new и delete вместо malloc и free. Честно говоря, я не знаю, нужна ли трансляция в C++ при использовании malloc, потому что в C++ я всегда использую new. Но, пожалуйста, не пишите C-код с компилятором C++. Выбирайте между C и C++ в зависимости от ваших потребностей.

  • 0
    Это не проблема.
  • 0
    @ Я не понимаю.
Показать ещё 18 комментариев
3

Вы освобождаете до выделения:

free(a); // This can lead to Undefined Behavior because a is containing some junk value
a=(int*) malloc(n);

Кроме того, нет особой необходимости использовать возвращаемый тип malloc и проверить свой аргумент malloc, вы не задаете размер в байтах правильно. Но в C++ требуется случай (поскольку вы отметили как C, так и C++).

Вывести результат malloc?

 a=(int*) malloc(n*sizeof(int));
2

Помимо упомянутой проблемы с размером размещения, вы не можете free(a) если вы уже не присвоили что-либо, или инициализировали a чтобы иметь значение NULL.

0

Это связано с тем, что ваш аргумент malloc() неверен. Функция не имеет понятия, какую "единицу" вы собираетесь использовать, поэтому единица для аргумента всегда "байты". С помощью оператора C++ new[], который работает на более высоком уровне в языке, поэтому он может учитывать размер шрифта.

Таким образом, измените выделение на:

a = malloc(n * sizeof *a);

Это удаляет бессмысленный и раздражающий приведение, а также добавляет отсутствующий sizeof для масштабирования аргумента количеством байтов в каждом объекте с указателем. Это хорошая форма использования malloc() для запоминания.

Также не free() случайные указатели.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню