- Моя программа показывает правильные результаты...потом грохот."
Итак, я пытаюсь создать программу, которая выделяет достаточно места для 5 целых чисел, используя malloc и указатель, чтобы действовать как массив, и через функцию я удваиваю размер "массива", используя realloc, вставляя квадрат каждого числа из первых 5 в 5 следующих пробелов. Это трудно объяснить так что вот пример:
Исходный массив перед "realloc"
arr[0]=1
arr[1]=2
arr[2]=3
arr[3]=4
arr[4]=5
После перераспределения и расчетов:
arr[5]=1
arr[6]=2
arr[7]=9
arr[8]=16
arr[9]=25
Таким образом, в основном содержимое массива[x] помещается в квадрат и вставляется в массив[x+5]
Проблема в том, что моя программа работает нормально, я получаю вышеприведенный массив в результате, но как только он показывает результаты, он падает, и я не могу понять почему. Вот мой код:
#include <stdio.h> #include <stdlib.h> int * double_old(int *old, int old_size, int new_size); int main(void) { int *old; int old_size = 5; int new_size; old=(int*) malloc(old_size*sizeof(int)); printf("Enter 5 integers: \n\n\n"); for(old_size = 0; old_size < 5; old_size++) { scanf("%d", &old[old_size]); } printf("The original array is: \n"); for(old_size = 0; old_size < 5; old_size++) { printf("old[%d] = %d\n", old_size, old[old_size]); } printf("\n\n\n"); double_old(old, old_size, new_size); free(old); } int * double_old(int *old, int old_size, int new_size) { int i=5, a=0; new_size = old_size*3; old = realloc(old, new_size); printf("The results based on the 5 previous numbers: \n"); for(;old_size<10;old_size++) { old[old_size] = old[old_size-i]* old[old_size-i]; printf("old[%d] = %d\n", old_size, old[old_size]); } }
Что я уже пробовал:
Последние 2 дня я пытался понять, что делаю не так, но пока не нашел никаких решений. Может быть, это как-то связано с malloc, так как я не совсем понимаю, как он работает, так как я новичок в C и программировании.
Jochen Arndt
Вы уже получили решение от Ричарда.
Но должно быть предупреждение компилятора типа
"нет оператора return в функции, возвращающей Non-void"
Если нет, увеличьте уровень предупреждения компилятора.
С использованием GCC-стена. С помощью VisualStudio используйте /Wall (установите его в настройках проекта).
Наличие таких предупреждений и исправление кода до тех пор, пока все предупреждения не исчезнут, сэкономит вам много времени.
Member 12955853
Решение мистера Ричарда, к сожалению, не сработало. Однако ответ ppolymorphe исправил это для меня. Проблема заключалась в том, что при перераспределении я ставил "old = realloc(old, new_size);"
с "new_size", равным 10. Я думал, что это означает, что перераспределение резервирует пространство для 10 целых чисел, но забыл, что я должен был поставить:
old = realloc(old, new_size*sizeof(int));
Я использую Dev C++ btw, который использует Gcc. Да, я знаю, что это отстой, но это тот, который они сказали нам использовать в университете
Jochen Arndt
Извините, я не проверил ответ и подумал, что это исправило проблему.
Но вы все равно должны установить уровень предупреждения.
Я не знаю Dev C++, но у него должна быть опция конфигурации.
Быстрый поиск предполагает, что он находится на вкладке Инструменты - Параметры компилятора - предупреждения.
Richard MacCutchan
Да, жаль, что я пропустил этот момент.