Динамическая память (Использование realloc)

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

В начале нужно наполнять договоренность инициализируясь под 0, до n=1, после этого договоренность должна расширять Вашу память в 5 и в то же время этот дебет наполнять места, которых нет, результат был бы должен печататься на экране, но во время выполнения программы он ничего не делает и заканчивается.

Спасибо за помощь!

Структура:

typedef struct{
    float i,r;
}Complejo;

Главный код:

int main(){
  int n=1;
  Complejo *nc1, *r1;
  nc1= (Complejo *)malloc(sizeof(Complejo)*n);
  for(int i=0; i<n; i++){
      nc1[i].i=i;
      nc1[i].r=i;
  }
  r1=masMemoria(nc1, 5);
  for(int i=0; i<n; i++){
      nc1[i].i=i;
      nc1[i].r=i;
  }
  for(int i=0; i<5; i++){
      printf("Real nc1: %f  Imaginario: %f\n", r1[i].r, r1[i].i);
  }
  return 0;
}

Функция:

Complejo *masMemoria(Complejo *nc, int x){
Complejo *aux;  
if(nc == NULL){
    nc=(Complejo *)malloc(sizeof(Complejo));
            if(nc==NULL){
                printf("Problemas al reservar memoria dinámica\n");
            }
}
else{
    aux=(Complejo *)realloc(nc, sizeof(Complejo)*x);
        if(aux!=NULL){
            nc=aux;
        }
        else{
            printf("Problemas al reservar memoria dinámica\n");
            return nc;
        }
}
return nc;
}
2
задан 21.03.2019, 05:19
3 ответа

Помимо прокомментированного, восходите расскажи, что не надо отличать, если nc1 недействительный, или не во время принятия решение между использованием malloc и realloc. realloc помогает тебе для двух случаев так же, как покажи в documentaciГіn :

In жените that ptr is в null пойнтера, the function behaves like malloc, assigning в new block of size байт and returning в пойнтера to its beginning.

, Который заканчивает тем, что говорит:

, Если ptr - недействительный указатель, она funciГіn comportarГЎ равно как malloc , распределяя новый блок size байт и возвращая указатель в начало вышеупомянутого блока.

, Объясненные с cГіdigo, следующий пример эквивалентный в тебя funciГіn оригинал, но с половиной lГ-neas и комплексности:

Complejo *masMemoria(Complejo *nc, int x)
{
  Complejo *aux = (Complejo *)realloc(nc, sizeof(Complejo)*x);
  if(aux!=NULL)
  {
    nc=aux;
  }
  else
  {
    printf("Problemas al reservar memoria dinámica\n");
  }
  return nc;
}
5
ответ дан 02.12.2019, 05:21

AquГ - estГЎ способ делать то, что ты хочешь (compreenda и execute):

#include<stdio.h>
#include<stdlib.h>

typedef struct{
    float i,r;
}Complejo;

Complejo *masMemoria(Complejo *nc, int x){
Complejo *aux;  
if(nc == NULL){
    nc=(Complejo *)malloc(sizeof(Complejo)*x);
            if(nc==NULL){
                printf("Problemas al reservar memoria dinámica\n");
            }
}
else{
    aux=(Complejo *)realloc(nc, sizeof(Complejo)*x);
        if(aux!=NULL){
            nc=aux;
        }
        else{
            printf("Problemas al reservar memoria dinámica\n");
            return nc;
        }
}
return nc;
}

int main(){
  int n=1;
  Complejo *nc1 = NULL;
  nc1= masMemoria(nc1, n);
  for(int i=0; i<n; i++){
      nc1[i].i=i;
      nc1[i].r=i;
  }
  n=5;
  nc1=masMemoria(nc1, n);
  for(int i=0; i<n; i++){
      nc1[i].i=i;
      nc1[i].r=i;
  }
  for(int i=0; i<n; i++){
      printf("Real nc1: %f  Imaginario: %f\n", nc1[i].r,nc1[i].i);
  }
  return 0;
}

, Когда ты сделал r1=masMemoria(nc1, 5);, realloc идет есть alocarte новость posiciГіn памяти, чтобы помещать 5 estruturas Complejo, и копировать контент, который у тебя был в nc1. Сделанный это, этот идет освобождать nc1.

Тогда, когда ты происходишь в for, и меняешь контент на nc1, уже estГЎs работая с одной memГіria не mГЎs заносит в список (то, что очень плохо):

for(int i=0; i<n; i++){
   nc1[i].i=i;
   nc1[i].r=i;
}

, Чтобы способствовать тому, чтобы ты cГіdigo оно функционировало только, это, уже был достаточен:

for(int i=0; i<5; i++){
   r1[i].i=i;
   r1[i].r=i;
}

, Но я оставил это лучше для того, чтобы n всегда содержал tamaГ±o. Равный

, ты не считал tamaГ±o (x), когда распределял память с malloc в тебе funciГіn masMemoria.

В конце концов, я устранил r1, так как nc1 не serГЎ mГЎs санкционировал quando передвинутый, она плохая prГЎctica поддерживать это.

2
ответ дан 02.12.2019, 05:21
  • 1
    Нет одного free, закончив main. – PaperBirdMaster 21.03.2019, 12:01
  • 2
    Ничего страшного.. Нет программы, которая оставалась бы с памятью без executar. – sbrubes 21.03.2019, 12:02
  • 3
    Если он происходит, как программисты у нас есть ответственность того, чтобы брать на себя ответственность ресурсов программы (он как будто ты говорил мне, что он ничего не перемещает из-за того, что бросает мусор на улице, уже pasará подметальщик улиц, который должен подбирать ее). Память не executa , память используется. – PaperBirdMaster 21.03.2019, 12:06
  • 4
    ¿ Está s, чтобы говорить мне, что моя программа оставляет себе память despué s того, чтобы выходить в return 0;? – sbrubes 21.03.2019, 12:10
  • 5
    Нет, я говорю, что как программисты у нас есть ответственность того, чтобы брать на себя ответственность ресурсов программы. – PaperBirdMaster 21.03.2019, 12:12

Во время выполнения программы ничего не делает и заканчивается.

Это одна descripciГіn очень бездельница проблемы, которая ademГЎs не приспосабливается к реальности. я протестировал ты cГіdigo и он показал мне данные из-за экрана:

Real nc1: 0.000000  Imaginario: 0.000000
Real nc1: 0.000000  Imaginario: 0.000000
Real nc1: 0.000000  Imaginario: 0.000000
Real nc1: 0.000000  Imaginario: 0.000000
Real nc1: 0.000000  Imaginario: 0.000000

Пытается быть mГЎs ясно и кратко в твоем вопросе.


, На основе ты анализируешь cГіdigo, я прихожу к заключению о том, что ты ждал этот вывод:

Real nc1: 0.000000  Imaginario: 0.000000
Real nc1: 1.000000  Imaginario: 1.000000
Real nc1: 2.000000  Imaginario: 2.000000
Real nc1: 3.000000  Imaginario: 3.000000
Real nc1: 4.000000  Imaginario: 4.000000

, Но не возможно давать, потому что в цикле наполненный данными:

for(int i=0; i<n; i++){
    nc1[i].i=i;
    nc1[i].r=i;
}

Ты Пробегаешь ее formaciГіn 1 до нее posiciГіn n, стоимость которых устанавливается 1 в начале main и вновь не меняется во всей программе. С другой стороны, ты размещаешь память на указателе nc1, но despuГ©s ты переселяешь память в новые дома на r1, указатель, перешедший в masMemoria не меняется, потому что ты это перемещаешь из-за копии (изменение стоимости указателя не выходит ее funciГіn).

" Я Предполагаю " что в действительности querГ-схвати делать это:

int main(){
  int n = 1;
  Complejo *nc1; // <-- Solo un puntero
  nc1 = (Complejo *)malloc(sizeof(Complejo) * n);

  for (int i = 0; i < n; ++i) {
      nc1[i].i = i;
      nc1[i].r = i;
  }

  n = 5;                    // <-- Nuevo valor de n.
  nc1 = masMemoria(nc1, n); // Usamos n.

  for (int i = 0; i < n; ++i) { // Ahora el bucle rellena toda la formación
      nc1[i].i = i;
      nc1[i].r = i;
  }

  for (int i = 0; i < n; ++i) {
      printf("Real nc1: %f  Imaginario: %f\n", nc1[i].r, nc1[i].i);
  }

  return 0;
}

Другая вещь, которые нужно иметь в виду.

В циклах, deberГ-эксперте способствовать предувеличению напротив постувеличения, кроме того, что у тебя будет мотив это не делать (что редко serГЎ asГ-). Читает этот artГ-зад для mГЎs детали.

apelotonamiento tambiГ©n способствует тому, чтобы ты cГіdigo он состоял difГ-cil в том, чтобы оставаться и понимать; в них aГ±os 90 tenГ-хозяев экраны 80 символов шириной и 25 lГ-neas высоты, этого hacГ - в необходимый выжимать cГіdigo для того, чтобы помещалось на экране самое большее возможное количество; к счастью они переместили почти 30 aГ±os и уже у нас нет этой limitaciГіn.

TambiГ©n ты должен иметь в виду, что estГЎs прося память dinГЎmica, но не она estГЎs освобождая, ты не забыл призыв к free, закончив программу.

, Чтобы заканчиваться, elecciГіn имен твоих переменных ухудшает mГЎs ее situaciГіn, имена, которые acrГіnimos или единственная буква достигают очень мало informaciГіn на манипулируемой информации и к тому же он делает mГЎs вероятно, что у двух различных переменных есть похожие имена и он спровоцировал confusiГіn (как в твоем цикле окраски, что ты печатаешь nc1 в тексте, но используешь стоимость r1).

Решая упомянутые проблемы, ты cГіdigo podrГ, - чтобы быть похожим в:

typedef struct{
    float imaginario, real;
} Complejo;

Complejo *masMemoria(Complejo *original, int cantidad) {
    Complejo *aux;

    if ((aux = (Complejo *)realloc(original, sizeof(Complejo) * cantidad))) {
        return aux;
    }

    printf("Problemas al reservar memoria dinámica\n");
    return NULL;
}

int main() {
    int cantidad = 1;
    Complejo *datos = (Complejo *)malloc(sizeof(Complejo) * cantidad);

    for (int indice = 0; indice < cantidad; ++indice) {
        datos[indice].imaginario = indice;
        datos[indice].real = indice;
    }

    cantidad = 5;
    datos = masMemoria(datos, cantidad);

    for (int indice = 0; indice < cantidad; ++indice) {
        datos[indice].imaginario = indice;
        datos[indice].real = indice;
    }

    for (int indice = 0; indice < cantidad; ++indice) {
        printf("Real: %f  Imaginario: %f\n", datos[indice].real, datos[indice].imaginario);
    }

    free(datos);

    return 0;
}

  1. TambiГ©n известный в качестве упорядочил или в inglГ©s array .
5
ответ дан 02.12.2019, 05:21
  • 1
    Это плохая одна solució n в ту, кто предлагает в конце концов , ademá s тяжелой одной убегает памяти . – sbrubes 21.03.2019, 11:52
  • 2
    @sbrubes có я говорю está несомненно плохо, но бегство памяти происходит от có я говорю оригинал не о моем modificació n. Однако, советы правильны. – PaperBirdMaster 21.03.2019, 11:53
  • 3
    Я говорю о твоей: в datos = masMemoria(cantidad); – sbrubes 21.03.2019, 11:56
  • 4
    Уже está исправленный @sbrubes, hací вовремя, что я заметил мою ошибку, но мне давала лень исправлять, но твой intervenció n он воодушевил меня делать это, спасибо :) – PaperBirdMaster 21.03.2019, 11:59
  • 5
    Сейчас он не составляет – sbrubes 21.03.2019, 12:00