Ondersteuning > Programmeren

Structureel struct probleem

(1/1)

kuifje09:
Ik bijt hier al een paar dagen mijn tanden op kapot en zie het nog steeds niet ?

De code spuugt steeds de laatste entry uit ( tweede deel programma ) in plaats van zoals  bij de eerste check...

Dit is maar een eenvoudig gedeelte van een groter geheel, maar hierin schuilt mijn blinde vlek...


--- Code: ---#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>

typedef struct {
        char * first;
        char* second;
} myStruct;

int main(){

        myStruct** myStructs = (myStruct**)malloc(20*sizeof(myStruct*));

        myStruct thisStruct;

        char* myString;

        int i;
        for( i = 0 ; i < 20 ; i++ ){
           myString = (char*)calloc(25,1);
           sprintf(myString,"string-1 %d",i);
           thisStruct.first = myString;

           myString = (char*)calloc(25,1);
           sprintf(myString,"string-2 %d",i);
           thisStruct.second = myString;

           myStructs[i] = &thisStruct;
           printf("first -- %s\nsecond - %s\n",
                           myStructs[i]->first,myStructs[i]->second);
        }

        printf("=================================\n");

        printf("why does this print always only the last entry... \n");

        for( i = 0 ; i < 20 ; i++ ){
                printf("first -- %s\nsecond - %s\n",
                                myStructs[i]->first,myStructs[i]->second);
        }
}


--- Einde van code ---

bart85:
Mystructs is een pointer naar pointer, geen array.

Is dit waar de foutmelding over gaat als je compiler cc gebruikt?

kuifje09:
Probleem was de ruimte voor de thisStruct.
opgelost door er een pointer voor te maken en maloc voor de ruimte..

Ziet en test....


--- Code: ---#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>

typedef struct {
        char * first;
        char* second;
} myStruct;

int main(){

        myStruct** myStructs = (myStruct**)malloc(20*sizeof(myStruct*));

        myStruct* thisStruct;

        char* myString;

        int i;
        for( i = 0 ; i < 20 ; i++ ){

           thisStruct = (myStruct*)malloc(sizeof(myStruct));

           myString = (char*)calloc(25,1);
           sprintf(myString,"string-1 %d",i);

           thisStruct->first = myString;

           myString = (char*)calloc(25,1);
           sprintf(myString,"string-2 %d",i);

           thisStruct->second = myString;

           myStructs[i] = (myStruct*)thisStruct;

           printf("first -- %s\nsecond - %s\n",
                           myStructs[i]->first,myStructs[i]->second);

        }

        printf("=================================\n");

        for( i = 0 ; i < 20 ; i++ ){
                printf("first -- %s\nsecond - %s\n",
                                myStructs[i]->first, myStructs[i]->second);
        }
}


--- Einde van code ---

En ja, nu nog de garbage collection voor het stoppen... malloc etc, wordt niet automatisch gefreed voorzover ik weet...

kuifje09:
Final versie voor de liefhebbers.
Het doet niet veel maar laat de proof of concept zien.
( het kan nog anders , ik weet het... maar dit is overzichtelijk voor mij.)


--- Code: ---#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>

typedef struct {
        char * first;
        char* second;
} myStruct;

int MAX = 1;

int main(int argc , char **argv){

        if (argc == 2) {
                printf("argc = %d, argv[1] = %s\n",argc,argv[1]);
                MAX = atoi(argv[1]); // non-integer = 0 ;)
        }else{
                printf("usage %s <number>\n",argv[0]);
                return (1);
        }

      // next malloc space needs to be freed on exit
        myStruct** myStructs = (myStruct**)malloc(1*sizeof(myStruct*));
        myStruct* thisStruct;
        char *myString, tmpString[1024];
        int i;


        for( i = 0 ; i < MAX ; i++ ){

        // expand space for the pointer to array of pointers
           myStructs = (myStruct**)realloc(myStructs, (i+1)*sizeof(myStruct*));

        // next malloc space needs to be freed on exit
           thisStruct = (myStruct*)malloc(sizeof(myStruct));

        // next malloc space needs to be freed on exit
           sprintf(tmpString,"string-1 %d",i);
           myString = (char*)calloc(strlen(tmpString)+1,1);
           strcpy(myString, tmpString);
           thisStruct->first = myString;

        // next malloc space needs to be freed on exit
           sprintf(tmpString,"string-2 %d",i);
           myString = (char*)calloc(strlen(tmpString)+1,1);
           strcpy(myString, tmpString);
           thisStruct->second = myString;

           myStructs[i] = (myStruct*)thisStruct;

           printf("first0 -- %s\nsecond0 - %s\n",
                           myStructs[0]->first,myStructs[0]->second);
           printf("first -- %s\nsecond - %s\n",
                           myStructs[i]->first,myStructs[i]->second);
        }

        printf("=================================\n");
        for( i = 0 ; i < MAX ; i++ ){
        printf("first -- %s\nsecond - %s\n",
                        myStructs[i]->first, myStructs[i]->second);
        }


        // free all [c|m]alloc space
        for ( i = 0 ; i < MAX ; i++ ){
            free( myStructs[i]->first); // members
            free( myStructs[i]->second);
            free( myStructs[i] );       // ponter to struct
        }
        free( myStructs);               // pointer to struct-pointers

        // even now, free space seems draining.... sometimes.
}

--- Einde van code ---

sla op als b.v.i : struct2.c
compile - run slag , b.v. : cc -g -o struct2 struct2.c && ./struct2 10000; echo $?

Navigatie

[0] Berichtenindex

Naar de volledige versie