buffer allocation frage



  • hi,

    wie kann man folgenden code verbessern? im moment verwende ich statische buffer... sollte ich da eher malloc verwenden? beim statischen buffer muss ich den vorher gross genug machen, sonst gibt es einen overflow...

    void intToString(const int num, char *result) {
    	sprintf(result+strlen(result), "%d", num);
    }
    
    void scan(node *nd, char *edges, char *labels) {
    	if(!nd) {
    		return;
    	}
    
    	char edge1[NUM_CHARS];
    	memset(&edge1, 0, sizeof(edge1));
    
    	intToString(nd->nodeId, edge1);
    
    	for (int i = 0; i < N; i++) {	
    		if (nd->child[i]) {	
    			strcat(edges, "\t");
    			strcat(edges, edge1);
    			strcat(edges, " -> ");
    
    			intToString(nd->child[i]->nodeId, edges);
    
    			strcat(edges, "\n");
    		}
    	}
    
    	strcat(labels, "\t");
    	strcat(labels, edge1);
    	strcat(labels, " [label=\"");
    	strcat(labels, createLabel(nd));
    	strcat(labels, "\"];");
    	strcat(labels, "\n");
    
    	for (int i = 0; i < N; i++) {
    		scan(nd->child[i], edges, labels);
    	}
    }
    
    bool generateDotFormat(node *root, const char *outputfile) {
    	FILE *file;
     	file = fopen(outputfile, "w");
    	if (file == NULL) {
    		return false;
    	}
    
    	char result[NUM_CHARS];
    	char edges[NUM_CHARS];
    	char labels[NUM_CHARS];
    	memset(&result, 0, sizeof(result));
    	memset(&edges, 0, sizeof(edges));
    	memset(&labels, 0, sizeof(labels));
    
    	strcat(result, "digraph G {");
    
    	scan(root, edges, labels);
    
    	strcat(result, "\n");
    	strcat(result, edges);
    	strcat(result, labels);
    	strcat(result, "}");
    
    	fprintf (file, "%s", result);
    
    	fclose(file);
    	return true;
    }
    


  • Gibt es dafür auch ein lauffähiges Beispiel?
    So ganz ohne Erklärung, oder Kommentare kann ich mir jetzt nicht so richtig vorstellen, was das macht. Und schließlich bin ich freiwillig hier und muss mich auch nicht mit viel Hirnschmalz einarbeiten. 🙂

    Dein intToString() sollte wohl eher appendIntAsString() heissen...
    Deine char Arrays kannst Du auch initialisieren:
    char arr[N]={0};
    fertig, ohne memset() .
    Statt des Umwegs über Strings direkt in den Stream zu schreiben wäre auch zu überlegen.



  • Schreibe eine neue Funktion addString, die dynamisch für neuen Speicher sorgt:

    char *addString(char **s,const char *a)
    {
      return strcat(*s=realloc(*s,strlen(*s)+strlen(a)+1),a);
    }
    
    und arbeite nur mit dyn. Speicher:
    
        char *result=calloc(1,1);
        char *edges=calloc(1,1);
        char *labels=calloc(1,1);
    
        addString(&result, "digraph G {");
        scan(root, edges, labels);
    
        ...
        free(result);
        ...
    


  • danke fuer das feedback...

    @Wutz: bist du dir sicher das dein addString kein undefined behavior erzeugt?



  • mein fehler, sollte wohl so sein:

    scan(root, &edges, &labels);
    

Log in to reply