Фон:
Я создал массив с помощью calloc(), и все отлично работало. Затем я использовал realloc(), чтобы увеличить массив. Кажется, он просто создает новый указатель, в котором ничего нет, и вызывает ошибку времени выполнения, когда я пытаюсь получить доступ к элементам в массиве.
Мой код:
#include <stdio.h>
int main() {
int *arr;
for (int i = 0; i < 5; i++){
if (i == 0) {
if ((arr = (int *) calloc(1, sizeof(int))) == NULL) {
printf("NO MORE SPACE TERMINATING PROGRAM");
return NULL;
}
} else {
int *tmp;
if ((tmp = (int *)realloc(arr, 4*sizeof(int)) == NULL)){
printf("NO MORE SPACE TERMINATING PROGRAM");
}
arr = tmp;
}
arr[i] = i;
}
}
Он выдает ошибку времени выполнения в строке arr[i]=i;
, когда i = 1;
Когда я добавляю точку останова на 1 строку выше arr = temp;
, это показывает, что temp полностью пуст.
Почему это происходит?
--------Обновлять----------------
Спасибо за помощь. Вот рабочий обновленный код:
#include <stdio.h>
#include <stdlib.h>
int main(){
int *arr = NULL;
for (int i = 0; i < 5; i++){
int *tmp;
if ((tmp = realloc(arr, (i+1) * sizeof(int))) == NULL){
printf("NO MORE SPACE TERMINATING PROGRAM");
}
arr = tmp;
arr[i] = i;
}
for (int i = 0; i < 5; i++) {
printf("%i",arr[i]);
}
}
Вывод: 01234
Спасибо всем за вашу помощь.
#include <stdlib.h>
, именно поэтому вам не следует приводить результатmalloc
,calloc
илиrealloc
. Такжеarr[4]
— это один элемент за пределами 4, которые выrealloc
(3 — это максимальный индекс, к которому вы можете обратиться с помощью массива из 4 элементов). - person Kninnug   schedule 16.11.2015i == 0
является избыточным, если вы изначально использовалиint *arr = NULL;
. Безопасно перераспределять нулевой указатель, и в этом случае он ведет себя так же, какmalloc
. - person M.M   schedule 16.11.2015for (i = 0; ___; i++) { if (i == 0) {....}
можно было бы написать более четко, просто указав блок{....}
перед началом цикла. - person M.M   schedule 16.11.2015