Привет всему сообществу, я учусь программировать с динамической памятью и нуждаюсь в том, чтобы реализовать функцию, которая позволяла бы мне расширять динамическую память договоренности.
В начале нужно наполнять договоренность инициализируясь под 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;
}
Помимо прокомментированного, восходите расскажи, что не надо отличать, если 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;
}
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 поддерживать это.
return 0;
?
– sbrubes
21.03.2019, 12:10
Во время выполнения программы ничего не делает и заканчивается.
Это одна 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;
}