2010-11-14 75 views
0

我是C新手,我无法使用动态内存。 我malloc为结构图,然后根据需要realloc。当我试图调试我的代码时,我注意到在ddd的帮助下,我覆盖了前一个数字的一​​个数字(在我提供的第二块代码中 - 变量的名称是figureHere)。如果有人能看到我愚蠢的错误的共鸣,请让我知道。动态内存:malloc和realloc

第一块代码在第二块中调用void。

#include <assert.h> 
#include "draw2.h" 
#include "draw2a.h" 
#include "draw2b.h" 

const char Exec_c[] = "java -jar Sketchpad.jar"; 

void parseFile(FILE * fp, FILE *sketcher){ 
    char line [MAX_WORD] = {"NULL"}; 
    char word [MAX_WORD] = {"NULL"}; 
    char figureName [MAX_WORD] = {"NULL"}; 
    struct figure *pointsAndname;      
    int countNumberoffigures = 0;         //accounts to which figure in the array we are on 
    printOutput(); 
    int temp = 0; 
    pointsAndname = malloc(temp); 
    assert(pointsAndname != NULL); 
    while (fgets(line, MAX_WORD - 1, fp) != NULL){ 
     int nuRead = sscanf(line, "%s", word); 
     assert(pointsAndname != NULL); 
     if (nuRead > 0){ 
      if(strncmp(word, "Figure", MAX_WORD)==0){   //1)reads the figure, name and the two starting points 
       countNumberoffigures += 1;      
       assert(pointsAndname != NULL); 
       figureFunction(fp,line, word, figureName, countNumberoffigures, pointsAndname + countNumberoffigures - 1); 
       if (temp <= countNumberoffigures){ 
        temp += sizeof(struct figure); 
        pointsAndname = realloc(pointsAndname, temp); 
       } 
      }             
      if(strncmp(word, "printFigure", MAX_WORD)==0){  //4)read the command printFigure, name of the figure 
       printFigure(fp, line, countNumberoffigures, pointsAndname + countNumberoffigures - 1); 
      } 
      if(strncmp(word, "drawFigure", MAX_WORD)==0){  //5)read the command drawFigure and the name of the figure 
       drawFigure(sketcher, line, countNumberoffigures); 
      } 
      if(strncmp(word, "translate", MAX_WORD)==0){  //6)read the command translate 
       translate(line, sketcher, countNumberoffigures); 
      } 
      if(strncmp(word, "child", MAX_WORD)==0){   //7)reads command child and the name of the figure 
       child(line, word, figureName, sketcher); 
      } 
      if(strncmp(word, "#", MAX_WORD)==0){    //8)reads the whole line until the \n 
       printf(line); 
      } 
      if(strncmp(word, "end", MAX_WORD)==0){ 
       fprintf (sketcher, "end\n"); 
      } 
      if(strncmp(word, "rotate", MAX_WORD)==0){ 
       rotate(line, sketcher, countNumberoffigures); 
      } 
     } 
    } 
} 

void processArgument(char argument[]){ 
    FILE *sketcher; 
    FILE *fp; 
    fp = fopen (argument, "r"); 
    sketcher = popen(Exec_c, "w"); 
    if (fp == NULL){ 
     printf ("Could not open pipe to %s\n", argument); 
     exit (EXIT_FAILURE); 
    } 
    if (sketcher == NULL){ 
     printf ("Could not open pipe to %s\n", argument); 
     exit (EXIT_FAILURE); 
    }else{ 
     parseFile(fp, sketcher); 
     if(fclose(fp)==EOF){ 
      printf("couldn't close pipe to %s.\n", argument); 
      exit(EXIT_FAILURE); 
     } 
     if (pclose(sketcher) == -1){             
      fprintf(stderr, "draw_line error: couldn't close pipe to %s.\n", Exec_c); 
      exit(EXIT_FAILURE);  
     } 
    } 
} 

int main (int argc, char *argv[]){ 
    int i; 
    if (argc < 2){ 
     printf ("%s\n", "0 comment(s)"); 
     exit(EXIT_FAILURE); 
    }else{ 
     for (i = 1; i < argc; i++){ 
      processArgument(argv[i]); 
     } 
    } 
    return 0; 
} 

#include "draw2.h" 
#include "draw2a.h" 

void printOutput(){ 
    printf("./draw2 started on:"); 

    fflush(stdout); 
    system("date\n"); 
} 
/*send what ever there is after the child to sketchpad(in that specific line)*/ 
void child (char line[], char word[], char nameFigure[], FILE * sketcher){   
    sscanf(line, "%s%s", word, nameFigure); 
    fprintf (sketcher, "%s\n", &line[6]); 
} 

/*I construct the struct by reading from the Figure line to the end figure line.*/ 
void figureFunction (FILE * fp, char line[], char word[], char figureName[], int countNumberoffigures, struct figure *figureHere){ 
    double startx, starty; 
    int temp = 0; 
    printf("The line: %s", line); 

    figureHere->vertices = malloc(temp); 
    sscanf(line, "%s%s%lf%lf%*s", word, figureHere->figureName, &startx, &starty); 
    (*(figureHere->vertices)).x = startx;    
    (*(figureHere->vertices)).y = starty; 
    printf("I'm in side figureFunction and this is my figureHere->figureName = %s\n\n", figureHere->figureName); 
    fgets(line, MAX_WORD - 1, fp);     
    int nuRead = sscanf(line, "%s", word);    //until the line with End Figure I construct my points of figure. 
    int i = 1;              
    while (strncmp(word, "End", MAX_WORD)!=0){ 
     if (strncmp(word, "#", MAX_WORD) == 0){ 
      printf("%s",line); 
     }   
     if (strncmp(word, "draw", MAX_WORD) == 0){ 
      sscanf (line, "%s%lf%lf", word, &startx, &starty); 
      figureHere->vertices[i].x = figureHere->vertices[i-1].x + startx; 
      figureHere->vertices[i].y = figureHere->vertices[i-1].y + starty; 
      i += 1; 
     } 
     fgets(line, MAX_WORD - 1, fp); 
     nuRead = sscanf(line, "%s", word); 
    }           
    figureHere->countPoints = i; 
    if (temp >= figureHere->countPoints){ 
     temp += sizeof(struct pointxy); 
     figureHere->vertices = realloc(figureHere->vertices, temp); 
    }       
} 

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
#include <stdlib.h> 
#include <math.h> 

void parseFile(FILE * fp, FILE * sketcher); 
void processArgument(char argument[]); 
void printOutput(); 

#define MAX_WORD 256 
#define initial_size 17 

extern const char argument[]; 

/* prototypes for non-c99 library functions */ 
FILE* popen(const char*, const char*); 
int pclose(FILE*); 
struct pointxy { 
    double x; 
    double y; 
}; 

struct figure{ 
    //struct figure *nextfigure; 

    char figureName[MAX_WORD]; 
    struct pointxy *vertices; 
    int countPoints; 
}; 

struct figure *figurehere; 
+3

将来,您应该尽量简化您的示例代码,尽可能减少仍然会产生错误的最小数量。这甚至可以帮助你自己解决问题。 – 2010-11-14 00:42:00

回答

2

保罗,

您最初的malloc()是零级;你至少需要一个元素才能开始。最重要的是,你正在做这个倒退。您正在尝试在分配空间来保存它们之前将值赋给figureHere。要么你需要找出结构中需要多少新值,然后调用malloc()或将realloc()代码放入if(strncmp(word,“draw”,MAX_WORD)== 0)部分:

if (strncmp(word, "draw", MAX_WORD) == 0){ 
    temp += sizeof(struct pointxy); 
    figureHere->vertices = realloc(figureHere->vertices, temp); 
    sscanf (line, "%s%lf%lf", word, &startx, &starty); 
    figureHere->vertices[i].x = figureHere->vertices[i-1].x + startx; 
    figureHere->vertices[i].y = figureHere->vertices[i-1].y + starty; 
    i += 1; 
} 
+0

而不是temp = o我可以做temp = sizeof(struct pointxy)吗? – 2010-11-14 00:40:07

+0

是的,您需要为至少一个元素分配空间。 – vonmoltke 2010-11-14 00:50:46

+0

谢谢。现在我得到段错误......这场战斗非常艰难:( – 2010-11-14 01:06:57

1
void figureFunction (FILE * fp, char line[], char word[], char figureName[], int countNumberoffigures, struct figure *figureHere){ 
    /* ... */ 
    int temp = 0; 
    /* ... */ 
    figureHere->vertices = malloc(temp); 

温度是0

/* ... */ 
    int nuRead = sscanf(line, "%s", word);    //until the line with End Figure I construct my points of figure. 
    int i = 1;              
    while (strncmp(word, "End", MAX_WORD)!=0){ 
     /* ... */ 
     if (strncmp(word, "draw", MAX_WORD) == 0){ 
      sscanf (line, "%s%lf%lf", word, &startx, &starty); 
      figureHere->vertices[i].x = figureHere->vertices[i-1].x + startx; 

不,不,不。 figureHere->vertices[1]不存在

  figureHere->vertices[i].y = figureHere->vertices[i-1].y + starty; 
      i += 1; 
     } 
     fgets(line, MAX_WORD - 1, fp); 
     nuRead = sscanf(line, "%s", word); 
    } 
    /* ... */ 
} 
+0

可以写intead: – 2010-11-14 00:34:07

+0

temp = sizeof(struct figure); – 2010-11-14 00:35:12

+0

@Paul:简洁地说,@ pmg建议(有些间接),你需要在使用它之前分配空间。分配零字节是实现定义的行为;你可能会得到一个NULL指针,或者你可能会得到一个非空指针,但由于零字节的可用空间,除了释放它之外,你无法对它做任何事情。作为一般规则,当在SO上提出问题时,消除代码中不必要的所有内容 - 并且在代码中显示了很多不必要的内容。另外,使它可编译 - 你提供的不是。 – 2010-11-14 00:38:40