2016-09-25 174 views
0

現在我堅持使用內存分配幾個小時。基本上,我必須添加一個新的圖形元素的矢量圖形,其初始化VectorGraphic是必要的。動態內存分配不匹配

第一個問題是用InitVectorGraphic方法內的存儲器分配被固定? (我認爲)現在我堅持的第二個問題是,即使內存分配自InitVectorGraphic方法,pElementsAddGraphicElement方法中沒有內存。 (即,即使是在一個方法(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 void(int x){x = 5;}'然後做int i = 7; f(i);'以後我的價值是多少?如果我做了'f(7)',那麼怎麼樣?' - 之後7的價值是多少?最後,如果我定義了'void g(int * q){q = malloc(sizeof(int));}'並且執行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();