2016-09-25 2 views
0

Я застрял с распределением памяти в течение нескольких часов. В принципе, я должен добавить новый графический элемент в векторную графику, для которой необходима инициализация VectorGraphic.Распределение динамического распределения памяти

Первой проблемой является выделение памяти внутри метода InitVectorGraphic, который исправлен? (Я думаю). Теперь вторая проблема, с которой я столкнулся, заключается в том, что, хотя память выделена из метода InitVectorGraphic, pElements не имеет памяти внутри метода AddGraphicElement. (То есть, даже после его инициализации в одном методе (InitVectorGraphic метод), изменения не отражают в других методах)

Вот мой полный код:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 

enum{ 
    RUNNING = 1 
}; 

struct Point   
{ 
    int x, y; 
}; 

struct Line   
{ 
    Point start; 
    Point end; 
}; 

struct GraphicElement  
{ 
    enum{ 
     SIZE = 256 
    }; 
    unsigned int numLines; 
    Line* pLines; 
    char name[SIZE]; 
}; 

typedef struct   
{ 
    unsigned int numGraphicElements; 
    GraphicElement* pElements; 
}VectorGraphic; 

void InitVectorGraphic(VectorGraphic* image){ 
    image = (VectorGraphic*)malloc(sizeof(VectorGraphic)); 
    (*image).pElements = (GraphicElement*)malloc(sizeof(GraphicElement)* 256); 
//Problem part 1 
    }; 

void AddGraphicElement(VectorGraphic* image){ 
    printf("\nADDING A Graphic Element"); //Problem part 2 
    int index = (*image).numGraphicElements; 

    printf("\nPlease enter the name of the new GraphicElement(<256 characters): "); 
    scanf("%s", &(*image).pElements[index].name); 
    printf("How many lines are there in the new GraphicElement? "); 
    scanf("%d", &(*image).pElements[index].numLines); 
    (*image).pElements[index].pLines = (Line*)malloc(sizeof(Line)* (*image).pElements[index].numLines); 
    for (int i = 0; i < (*image).pElements[index].numLines; i++){ 
     Line line; 
     printf("Please enter the x coord of the start point of line index %d: ", i); 
     scanf("%d", &line.start.x); 
     printf("Please enter the y coord of the start point of line index %d: ", i); 
     scanf("%d", &line.start.y); 
     printf("Please enter the x coord of the end point of line index %d: ", i); 
     scanf("%d", &line.end.x); 
     printf("Please enter the y coord of the end point of line index %d: ", i); 
     scanf("%d", &line.end.y); 

     (*image).pElements[index].pLines[i] = line; 
    } 

    (*image).numGraphicElements = (*image).numGraphicElements + 1; 
    printf("Added"); 
    //add graphicElement to Image 

}; 
void ReportVectorGraphic(VectorGraphic* image){ 
    printf("\nVectorGraphic Report"); 
    for (int i = 0; i < (*image).numGraphicElements; i++){ 
     printf("\nReporting Graphic Element #%d", i); 
     printf("\nGraphic Element name: %s", (*image).pElements[i].name); 
     for (int j = 0; j < (*image).pElements[i].numLines; j++){ 
      printf("\nLine #%d start x: %d", j, (*image).pElements[i].pLines[j].start.x); 
      printf("\nLine #%d start y: %d", j, (*image).pElements[i].pLines[j].start.y); 
      printf("\nLine #%d end x: %d", j, (*image).pElements[i].pLines[j].end.x); 
      printf("\nLine #%d end y: %d", j, (*image).pElements[i].pLines[j].end.y); 
     }  
    } 

}; 

void CleanUpVectorGraphic(VectorGraphic* image){ 
    free(image); 
}; 

VectorGraphic Image; 


int main()   
{ 
    char response; 
    InitVectorGraphic(&Image); 
    while (RUNNING)    
    { 
     printf("\nPlease select an option:\n"); 
     printf("1. Add a Graphic Element\n"); 
     printf("2. List the Graphic Elements\n"); 
     printf("q. Quit\n"); printf("CHOICE: "); 
     fflush(stdin); 
     scanf("%c", &response); 
     switch (response)      
     { 
     case '1':AddGraphicElement(&Image); 
      break; 
     case '2':ReportVectorGraphic(&Image); 
      break; 
     case 'q':CleanUpVectorGraphic(&Image); 
      return 0; 
     default:printf("Please enter a valid option\n"); 
     } 
     printf("\n"); 
    } 
} 

Что такое решение?

+2

Это c или C++? –

+0

Когда я определяю 'void f (int x) {x = 5;}', а затем do 'int i = 7; f (i); 'какое значение i впоследствии? Что делать, если я делаю 'f (7);' - каково значение 7 после? И, наконец, если я определяю 'void g (int * q) {q = malloc (sizeof (int));}' и do 'int * p = NULL; g (p); 'какое значение p впоследствии? – immibis

+0

Простите, это в C. @CaptainGiraffe – user3397557

ответ

0

Это очень стандартная путаница с указателями. Вам необходимо следующие изменения:

VectorGraphic* Image; //make it a pointer 
void InitVectorGraphic(VectorGraphic** image) //expect pointer-to-pointer 
{ 
    *image = (VectorGraphic*)malloc(sizeof(VectorGraphic)); //assign allocated buffer to pointer 
    (*image)->pElements = (GraphicElement*)malloc(sizeof(GraphicElement)* 256); 
} 

InitVectorGraphic(&Image); //call remains the same 

В вашем старом коде, вы утечка памяти, вы можете думать изображения в качестве локальной переменной, определенной, как показано ниже:

InitVectorGraphic(VectorGraphic* image) 
{ 
    image = malloc(); //Here you are allocating memory to a local variable not to the address Image 
    //no free()'ing of image variable 
} 

Шаги исполнения, как в вашем старом коде просто сделав два присваивания со второй перезаписью присваивания:

VectorGraphic *image = &Image; 
image = malloc(); 
Смежные вопросы