Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Sono molte le novità che ASUS ha scelto di presentare al CES 2026 di Las Vegas, partendo da una gamma di soluzioni NUC con varie opzioni di processore passando sino agli schermi gaming con tecnologia OLED. Il tutto senza dimenticare le periferiche di input della gamma ROG e le soluzioni legate alla connettività domestica
Le novità ASUS per il 2026 nel settore dei PC desktop
Le novità ASUS per il 2026 nel settore dei PC desktop
Molte le novità anticipate da ASUS per il 2026 al CES di Las Vegas: da schede madri per processori AMD Ryzen top di gamma a chassis e ventole, passando per i kit di raffreddamento all in one integrati sino a una nuova scheda video GeForce RTX 5090. In sottofondo il tema dell'intelligenza artificiale con una workstation molto potente per installazioni non in datacenter
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-04-2018, 13:45   #1
marilynm69
Junior Member
 
Iscritto dal: Oct 2008
Messaggi: 16
[C] problema allocazione puntatore a puntatore

Ciao a tutti, ho un problema con una funzione che deve prendere in ingresso un numero variable di stringhe e creare un puntatore ad array di puntatore a char (le stringhe caricate).
codice:
Codice:
void addit( char *title, char *elems,...)

{
	va_list argP;
	va_start(argP, elems);

    char **mitems; 
    mitems=(char **)xMalloc(sizeof(char*));
    
	char *p;
    int i; 
    for (i=0; ((p=va_arg(argP,char*)) !=NULL) ; i++ )
    {
     mitems=xRealloc(mitems,sizeof(mitems)+sizeof(*mitems));
        mitems[i]=(char *)xCalloc(1, sizeof(char*));
        mitems[i]=p;

		printf("\n\t%d: %s",i+1, p);
        	printf("\n\t\t+++ %s",mitems[i]);


    }
    printf("\n\n%d arguments\n", i);
    va_end(argP);
}


int main()
{

    addit("FILE","new","open","save","backup","print","setup","exit",NULL);

    return 0;
}

valgrind:
Codice:
==13035== Memcheck, a memory error detector
==13035== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==13035== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==13035== Command: ./serate\ project
==13035== 

	1: open
		+++ open
	2: save
==13035== Invalid write of size 8
==13035==    at 0x4077CD: addit (Menu.c:440)
==13035==    by 0x40791C: temp (Menu.c:456)
==13035==    by 0x406A93: main (main.c:32)
==13035==  Address 0x6dbd620 is 0 bytes after a block of size 16 alloc'd
==13035==    at 0x4C2FD5F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13035==    by 0x406B60: xRealloc (Menu.c:32)
==13035==    by 0x40779B: addit (Menu.c:439)
==13035==    by 0x40791C: temp (Menu.c:456)
==13035==    by 0x406A93: main (main.c:32)
==13035== 
==13035== Invalid write of size 8
==13035==    at 0x4077F1: addit (Menu.c:441)
==13035==    by 0x40791C: temp (Menu.c:456)
==13035==    by 0x406A93: main (main.c:32)
==13035==  Address 0x6dbd620 is 0 bytes after a block of size 16 alloc'd
==13035==    at 0x4C2FD5F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13035==    by 0x406B60: xRealloc (Menu.c:32)
==13035==    by 0x40779B: addit (Menu.c:439)
==13035==    by 0x40791C: temp (Menu.c:456)
==13035==    by 0x406A93: main (main.c:32)
==13035== 
		+++ save
==13035== Invalid read of size 8
==13035==    at 0x407832: addit (Menu.c:444)
==13035==    by 0x40791C: temp (Menu.c:456)
==13035==    by 0x406A93: main (main.c:32)
==13035==  Address 0x6dbd620 is 0 bytes after a block of size 16 alloc'd
==13035==    at 0x4C2FD5F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13035==    by 0x406B60: xRealloc (Menu.c:32)
==13035==    by 0x40779B: addit (Menu.c:439)
==13035==    by 0x40791C: temp (Menu.c:456)
==13035==    by 0x406A93: main (main.c:32)
==13035== 
	3: backup
		+++ backup
	4: print
		+++ print
	5: setup
		+++ setup
	6: exit
		+++ exit

6 arguments
==13035== 
==13035== HEAP SUMMARY:
==13035==     in use at exit: 64 bytes in 7 blocks
==13035==   total heap usage: 14 allocs, 7 frees, 1,176 bytes allocated
==13035== 
==13035== 16 bytes in 1 blocks are definitely lost in loss record 1 of 2
==13035==    at 0x4C2FD5F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13035==    by 0x406B60: xRealloc (Menu.c:32)
==13035==    by 0x40779B: addit (Menu.c:439)
==13035==    by 0x40791C: temp (Menu.c:456)
==13035==    by 0x406A93: main (main.c:32)
==13035== 
==13035== 48 bytes in 6 blocks are definitely lost in loss record 2 of 2
==13035==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13035==    by 0x406B14: xCalloc (Menu.c:22)
==13035==    by 0x4077CC: addit (Menu.c:440)
==13035==    by 0x40791C: temp (Menu.c:456)
==13035==    by 0x406A93: main (main.c:32)
==13035== 
==13035== LEAK SUMMARY:
==13035==    definitely lost: 64 bytes in 7 blocks
==13035==    indirectly lost: 0 bytes in 0 blocks
==13035==      possibly lost: 0 bytes in 0 blocks
==13035==    still reachable: 0 bytes in 0 blocks
==13035==         suppressed: 0 bytes in 0 blocks
==13035== 
==13035== For counts of detected and suppressed errors, rerun with: -v
==13035== ERROR SUMMARY: 14 errors from 5 contexts (suppressed: 0 from 0)
a me servirebbe una cosa così:



il problema più grosso è ovviamente quello della memoria, poi non capisco perchè inizia a prendermi il secondo dei parametri variabili("open"), invece che dal prino ("new").
grazie anticipatamente...

P.S. le funzioni xMalloc, xCalloc, xRealloc sono remplicemente malloc, calloc e realloc con il controllo sulla memoria allocata, e restituiscono il puntatore o chiudono il programma

Ultima modifica di marilynm69 : 04-04-2018 alle 14:51. Motivo: aggiunta PS
marilynm69 è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2018, 17:17   #2
grigor91
Senior Member
 
L'Avatar di grigor91
 
Iscritto dal: Dec 2007
Città: brianza
Messaggi: 717
Quote:
Originariamente inviato da marilynm69 Guarda i messaggi
Ciao a tutti, ho un problema con una funzione che deve prendere in ingresso un numero variable di stringhe e creare un puntatore ad array di puntatore a char (le stringhe caricate).
codice:
Codice:
void addit( char *title, char *elems,...)

{
	va_list argP;
	va_start(argP, elems);

  ...

}


int main()
{

    addit("FILE","new","open","save","backup","print","setup","exit",NULL);

    return 0;
}


il problema più grosso è ovviamente quello della memoria, poi non capisco perchè inizia a prendermi il secondo dei parametri variabili("open"), invece che dal prino ("new").
grazie anticipatamente...

P.S. le funzioni xMalloc, xCalloc, xRealloc sono remplicemente malloc, calloc e realloc con il controllo sulla memoria allocata, e restituiscono il puntatore o chiudono il programma

title punta al primo carattere di "FILE", elems al primo carattere di "new", quindi il primo argomento variabile è "open".

Inoltre quando effettui la reallocazione la nuova dimensione è formata dalla somma della dimensione dei due puntatori, che quindi sarà sempre costante (8 o 16 byte in base all'architettura).
__________________
AMD Ryzen 9700X MSI RX 480 Gaming X 8G ASRock B850 Pro-A Windows 11 Pro RAM DDR5 16GBx2 TEAMGROUP T-Create Expert 6000 MHz CL30 SSD Crucial T500 4TB case Corsair Carbide 200R

Ultima modifica di grigor91 : 04-04-2018 alle 18:08.
grigor91 è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2018, 18:12   #3
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
se non ho capito male

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

}

e fa già quello che chiedi
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2018, 18:21   #4
marilynm69
Junior Member
 
Iscritto dal: Oct 2008
Messaggi: 16
in va_start(argP, elems);
elemsnon deve essere l'ultimo degli argomenti fissi? quindi new,...

char * title è un'altra cosa a parte da quella lista...inizia da open anche se sostituisco char *title con int title e ci passo un numero, come potrebbe pure tranquillamente essere...

per riallocare non ho capito come allora dovrei fare...
marilynm69 è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2018, 18:23   #5
marilynm69
Junior Member
 
Iscritto dal: Oct 2008
Messaggi: 16
Quote:
Originariamente inviato da misterx Guarda i messaggi
se non ho capito male

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

}

e fa già quello che chiedi
non mi serve,nell'esempio c'è main ma la funzione è interna ad un altra, a sua volta interna al main...
marilynm69 è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2018, 19:17   #6
marilynm69
Junior Member
 
Iscritto dal: Oct 2008
Messaggi: 16
per l'allocazione ho risolto, grazie grigor91 per avermi fatto notare...
ho fatto così:
Codice:
…..
   char **mitems;
    mitems=(char **)xMalloc(sizeof(char*));
    int i; 
    for (i=0; ((p=va_arg(argP,char*)) !=NULL) ; i++ )

    {
	mitems=(char **)xRealloc(mitems,(i+1)*sizeof(char*));
	mitems[i]=p;
     
	printf("\n\t%d: %s",i+1, p);
            printf("\n\t\t+++ %s",mitems[i]);
    }
…..
per gli argomenti variabili nessun suggerimento?

Ultima modifica di marilynm69 : 04-04-2018 alle 19:47.
marilynm69 è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2018, 20:10   #7
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
io non ho capito se devi prendere n argomenti in numero e lunghezza variabile e memorizzarli in un array: è così?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2018, 21:08   #8
marilynm69
Junior Member
 
Iscritto dal: Oct 2008
Messaggi: 16
Quote:
Originariamente inviato da misterx Guarda i messaggi
io non ho capito se devi prendere n argomenti in numero e lunghezza variabile e memorizzarli in un array: è così?
esatto....per l'array e l'allocazione risolto, non capisco perchè mi inizia a prendere gli argomenti dal secondo

se faccio
Codice:
void addit(char *elems,...)
funziona come dovrebbe, ma a me serve passare argomenti prima, e per chiarezza un altro char * come titolo...

Ultima modifica di marilynm69 : 04-04-2018 alle 21:27.
marilynm69 è offline   Rispondi citando il messaggio o parte di esso
Old 05-04-2018, 09:41   #9
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
Codice:
int main()
{
    addit("FILE","new", "open", "save", "backup", "print", "setup", "exit", NULL);

    return 0;
}
//---------------------------------------------------------------------------

void addit( char *title, char *elems ...)

{
        va_list argP;
	va_start(argP, elems);

        char **mitems;
        mitems=(char **)malloc(sizeof(char*));

	char *p;
        int i;

        for (i=0; ((p=va_arg(argP,char*)) !=NULL) ; i++ )
        {
                mitems=(char **)realloc(mitems,sizeof(mitems)+sizeof(*mitems));
                mitems[i]=(char *)calloc(1, sizeof(char*));
                mitems[i]=p;

		printf("\n\t%d: %s",i+1, p);
        	printf("\n\t\t+++ %s",mitems[i]);
        }

        printf("\n\n%d arguments\n", i);
        va_end(argP);

        getchar();
}
//---------------------------------------------------------------------------
Codice:
        1: open
                +++ open
        2: save
                +++ save
        3: backup
                +++ backup
        4: print
                +++ print
        5: setup
                +++ setup
        6: exit
                +++ exit

6 arguments

Codice:
int main()
{
    addit("FILE","new", "open", "save", "backup", "print", "setup", "exit", NULL);

    return 0;
}
//---------------------------------------------------------------------------

void addit( char *title ...)

{
        va_list argP;
	va_start(argP, title);

        char **mitems;
        mitems=(char **)malloc(sizeof(char*));

	char *p;
        int i;

        for (i=0; ((p=va_arg(argP, char*)) !=NULL) ; i++ )
        {
                mitems=(char **)realloc(mitems,sizeof(mitems)+sizeof(*mitems));
                mitems[i]=(char *)calloc(1, sizeof(char*));
                mitems[i]=p;

		printf("\n\t%d: %s",i+1, p);
        	printf("\n\t\t+++ %s",mitems[i]);
        }

        printf("\n\n%d arguments\n", i);
        va_end(argP);

        getchar();
}
//---------------------------------------------------------------------------
Codice:
        1: new
                +++ new
        2: open
                +++ open
        3: save
                +++ save
        4: backup
                +++ backup
        5: print
                +++ print
        6: setup
                +++ setup
        7: exit
                +++ exit

7 arguments
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 05-04-2018, 11:13   #10
marilynm69
Junior Member
 
Iscritto dal: Oct 2008
Messaggi: 16
fosse solo un elenco che mi serve andrebbe bene, ma a me serve passare un puntatore a una struttura, il titolo a parte, e gli elementi un altra cosa...
ad esempio la funzione execl:
Codice:
int execl (const char *__path, const char *__arg, ...)
come vedi sono 2 cose differenti path e arguments....a me serve title e gli elementi...in ogni caso, anche come hai fatto tu, dov'è finito "FILE"? un probabile utente si vedrà sparire la prima variabile, perchè mai?

anche semplificando tutto:
Codice:
void addit(char * elems,...){

va_list argP;
    va_start(argP, elems);
char *p;
    int i;
    for (i=0; ((p=va_arg(argP,char*)) !=NULL) ; i++ )
    {
        printf("\n%s",p);
    }
    va_end(argP);
}
stampa da new:
Codice:
new
open
save
backup
print
setup
exit
tolgo pure il ciclo for:
Codice:
void addit(char * elems,...){

    va_list argP;
    va_start(argP, elems);
    printf("\n%s",va_arg(argP,char*));
    va_end(argP);
}
stampa " new " perchè? dove va a finire la prima variabile?

Ultima modifica di marilynm69 : 05-04-2018 alle 11:37.
marilynm69 è offline   Rispondi citando il messaggio o parte di esso
Old 05-04-2018, 12:21   #11
marilynm69
Junior Member
 
Iscritto dal: Oct 2008
Messaggi: 16
Codice:
void addit(char * elems, ...){

    va_list argP;
    va_start(argP, elems);
     
    printf("\n%s",elems);
    printf("\n%s",va_arg(argP,char*));

    va_end(argP);
}
la risolvo così, prendo elems come primo elemento, ci faccio il controllo se esiste almeno quello e continuo con il ciclo ,con va_start(argP, elems);

Grazie misterx per avermi portato comunque a risolverlo

PS. devo mettere risolto nel titolo? se si come lo modifico?

Ultima modifica di marilynm69 : 05-04-2018 alle 12:23. Motivo: aggiunta PS
marilynm69 è offline   Rispondi citando il messaggio o parte di esso
Old 06-04-2018, 20:37   #12
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
però se si fa a questo modo, funziona come vuoi tu, invertendo i parametri della funzione

da così void addit(char *title, char *elems ...); a così void addit(char *elems, char *title ...);

Codice:
void addit(char *elems, char *title ...);

int main()
{
    addit("FILE","new", "open", "save", "backup", "print", "setup", "exit", NULL);

    return 0;
}
//---------------------------------------------------------------------------

void addit(char *elems, char *title ...)

{
        va_list argP;
	va_start(argP, elems);

        char **mitems;
        mitems=(char **)malloc(sizeof(char*));

	char *p;
        int i;

        for (i=0; ((p=va_arg(argP,char*)) !=NULL) ; i++ )
        {
                mitems=(char **)realloc(mitems,sizeof(mitems)+sizeof(*mitems));
                mitems[i]=(char *)calloc(1, sizeof(char*));
                mitems[i]=p;

		printf("\n\t%d: %s",i+1, p);
        	printf("\n\t\t+++ %s",mitems[i]);
        }

        printf("\n\n%d arguments\n", i);
        va_end(argP);

        getchar();
}
//---------------------------------------------------------------------------

sembra più un problema di posizione dei parametri

Ultima modifica di misterx : 06-04-2018 alle 20:42.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2018, 12:32   #13
marilynm69
Junior Member
 
Iscritto dal: Oct 2008
Messaggi: 16
stessa cosa, comunque l'ho risolto così...ora il problema è un altro, ma il puntatore è puntatore a puntatore a struttura, e viene passato alla funzione addit per poi riallocare di volta in volta...non so se postarlo sempre quà, anche perchè il titolo sarebbe simile

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>


typedef struct s_drop_down_menu_labels
{
    char *title;
    char **items;
} MenuLabels;

MenuLabels ** ml_init(void)
{
    MenuLabels **ml;
    ml=(MenuLabels **)calloc(2,sizeof(MenuLabels*));
    ml[1]=NULL;
    return ml;
}



void addit(MenuLabels **mlabels, char *title, char *elems,...)
{

    int j;
    for (j=0; mlabels[j]!=NULL ; j++ );
    printf("\n\nCHECK:MenuLabels has %d menu",j);

    mlabels=(MenuLabels **)realloc(mlabels,(j+2)*sizeof(MenuLabels*));

    mlabels[j]=(MenuLabels *)malloc(1*sizeof(MenuLabels));

    mlabels[j+1]=NULL;




    mlabels[j]->title=title;

    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    int i=0;
    char **mitems=NULL;
    mitems=(char **)malloc(sizeof(char*));
    mitems[i]=elems;

    va_list argP;
    va_start(argP, elems);

    char *p;
    for (i=1; ((p=va_arg(argP,char*)) !=NULL) ; i++ )
    {
        mitems=(char **)realloc(mitems,(i+1)*sizeof(char*));
        mitems[i]=p;
    }

    if (!p)
    {
        mitems=(char **)realloc(mitems,(i+1)*sizeof(char*));
        mitems[i]=NULL;
    }

    va_end(argP);
    /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

    mlabels[j]->items=mitems;
}



int main()
{
    MenuLabels **ml;
    ml=ml_init();
    addit(ml,"FILE","new","open","save","backup","print","setup","exit",NULL);
    addit(ml,"AFILE","Anew","Asave","Abackup","Aexit",NULL);
    addit(ml,"BFILE","Bnew","Bopen","Bsave","Bprint","Bexit",NULL);
    addit(ml,"CFILE","Cnew","Copen","Csave","Cbackup","Cprint","Csetup","Cexit",NULL);
    addit(ml,"DFILE","Dnew","Dsave","Dbackup","Dexit",NULL);
    addit(ml,"EFILE","Enew","Eopen","Esave","Eprint","Eexit",NULL);

    free(ml);

    fprintf(stdout,"\n\033[1;91m***END***\033[0m\n");
    return 0;
}
output terminale:

Codice:
CHECK:MenuLabels has 0 menu

CHECK:MenuLabels has 1 menu

CHECK:MenuLabels has 2 menu

CHECK:MenuLabels has 2 menu

CHECK:MenuLabels has 2 menu

CHECK:MenuLabels has 2 menu
***END***
output Valgrind:
Codice:
==13907== Memcheck, a memory error detector
==13907== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==13907== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==13907== Command: ./prove
==13907== 


==13907== Invalid read of size 8
==13907==    at 0x400812: addit (main.c:26)
==13907==    by 0x400B27: main (main.c:75)
==13907==  Address 0x5204040 is 0 bytes inside a block of size 16 free'd
==13907==    at 0x4C2FD5F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13907==    by 0x400855: addit (main.c:29)
==13907==    by 0x400AF1: main (main.c:74)
==13907==  Block was alloc'd at
==13907==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13907==    by 0x40075C: ml_init (main.c:15)
==13907==    by 0x400AB0: main (main.c:73)
==13907== 
CHECK:MenuLabels has 0 menu

==13907== Invalid free() / delete / delete[] / realloc()
==13907==    at 0x4C2FD5F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13907==    by 0x400855: addit (main.c:29)
==13907==    by 0x400B27: main (main.c:75)
==13907==  Address 0x5204040 is 0 bytes inside a block of size 16 free'd
==13907==    at 0x4C2FD5F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13907==    by 0x400855: addit (main.c:29)
==13907==    by 0x400AF1: main (main.c:74)
==13907==  Block was alloc'd at
==13907==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13907==    by 0x40075C: ml_init (main.c:15)
==13907==    by 0x400AB0: main (main.c:73)
==13907== 
==13907== Invalid write of size 8
==13907==    at 0x400882: addit (main.c:31)
==13907==    by 0x400B27: main (main.c:75)
==13907==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==13907== 
==13907== 
==13907== Process terminating with default action of signal 11 (SIGSEGV)
==13907==  Access not within mapped region at address 0x0
==13907==    at 0x400882: addit (main.c:31)
==13907==    by 0x400B27: main (main.c:75)
==13907==  If you believe this happened as a result of a stack
==13907==  overflow in your program's main thread (unlikely but
==13907==  possible), you can try to increase the size of the
==13907==  main thread stack using the --main-stacksize= flag.
==13907==  The main thread stack size used in this run was 8388608.
CHECK:MenuLabels has 0 menu==13907== 
==13907== HEAP SUMMARY:
==13907==     in use at exit: 112 bytes in 4 blocks
==13907==   total heap usage: 14 allocs, 10 frees, 1,392 bytes allocated
==13907== 
==13907== 16 bytes in 1 blocks are definitely lost in loss record 2 of 4
==13907==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13907==    by 0x400881: addit (main.c:31)
==13907==    by 0x400B27: main (main.c:75)
==13907== 
==13907== 96 (16 direct, 80 indirect) bytes in 1 blocks are definitely lost in loss record 4 of 4
==13907==    at 0x4C2FD5F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13907==    by 0x400855: addit (main.c:29)
==13907==    by 0x400AF1: main (main.c:74)
==13907== 
==13907== LEAK SUMMARY:
==13907==    definitely lost: 32 bytes in 2 blocks
==13907==    indirectly lost: 80 bytes in 2 blocks
==13907==      possibly lost: 0 bytes in 0 blocks
==13907==    still reachable: 0 bytes in 0 blocks
==13907==         suppressed: 0 bytes in 0 blocks
==13907== 
==13907== For counts of detected and suppressed errors, rerun with: -v
==13907== ERROR SUMMARY: 5 errors from 5 contexts (suppressed: 0 from 0)
sembra ci sia un errore in
Codice:
mlabels=(MenuLabels **)realloc(mlabels,(j+2)*sizeof(MenuLabels*));
sono giorni che non ne esco...la parte tra i due commenti "/*+++...+++*/" è a posto

Ultima modifica di marilynm69 : 09-04-2018 alle 12:47.
marilynm69 è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2018, 15:10   #14
marilynm69
Junior Member
 
Iscritto dal: Oct 2008
Messaggi: 16
RISOLTO

Risolto finalmente ....ecco il codice:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>


typedef struct s_drop_down_menu_labels
{
    char *title;
    char **items;
} MenuLabels;

MenuLabels ** ml_init(void)
{
    MenuLabels **ml;
    ml=(MenuLabels **)calloc(2,sizeof(MenuLabels*));
    ml[1]=NULL;
    return ml;
}



void addit(MenuLabels ***mlabels, char *title, char *elems,...)
{

    int j;
    for (j=0; (*mlabels)[j]!=NULL ; j++ );
    printf("\n\nCHECK:MenuLabels has %d menu",j);

    *mlabels=(MenuLabels **)realloc(*mlabels,(j+2)*sizeof(MenuLabels*));

    (*mlabels)[j]=(MenuLabels *)malloc(1*sizeof(MenuLabels));

    (*mlabels)[j+1]=NULL;




    (*mlabels)[j]->title=title;

    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    int i=0;
    char **mitems=NULL;
    mitems=(char **)malloc(sizeof(char*));
    mitems[i]=elems;

    va_list argP;
    va_start(argP, elems);

    char *p;
    for (i=1; ((p=va_arg(argP,char*)) !=NULL) ; i++ )
    {
        mitems=(char **)realloc(mitems,(i+1)*sizeof(char*));
        mitems[i]=p;
    }

    if (!p)
    {
        mitems=(char **)realloc(mitems,(i+1)*sizeof(char*));
        mitems[i]=NULL;
    }

    va_end(argP);
    /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

    (*mlabels)[j]->items=mitems;
    free(mitems);
}


int main()
{
    MenuLabels **ml;
    ml=ml_init();
    addit(&ml,"FILE","new","open","save","backup","print","setup","exit",NULL);
    addit(&ml,"AFILE","Anew","Asave","Abackup","Aexit",NULL);
    addit(&ml,"BFILE","Bnew","Bopen","Bsave","Bprint","Bexit",NULL);
    addit(&ml,"CFILE","Cnew","Copen","Csave","Cbackup","Cprint","Csetup","Cexit",NULL);
    addit(&ml,"DFILE","Dnew","Dsave","Dbackup","Dexit",NULL);
    addit(&ml,"EFILE","Enew","Eopen","Esave","Eprint","Eexit",NULL);


    printf("\n**********CHECK: %s",ml[0]->title);

for (int i=0;ml[i]!=NULL ;i++ )
    free(ml[i]);

    fprintf(stdout,"\n\033[1;91m***END***\033[0m\n");
    return 0;
}
unica cosa rimangono byte da deallocare che non capisco quali siano:
Codice:
==18805== Memcheck, a memory error detector
==18805== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==18805== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==18805== Command: ./prove
==18805== 


CHECK:MenuLabels has 0 menu

CHECK:MenuLabels has 1 menu

CHECK:MenuLabels has 2 menu

CHECK:MenuLabels has 3 menu

CHECK:MenuLabels has 4 menu

CHECK:MenuLabels has 5 menu
**********CHECK: FILE
***END***
==18805== 
==18805== HEAP SUMMARY:
==18805==     in use at exit: 56 bytes in 1 blocks
==18805==   total heap usage: 52 allocs, 51 frees, 2,504 bytes allocated
==18805== 
==18805== 56 bytes in 1 blocks are definitely lost in loss record 1 of 1
==18805==    at 0x4C2FD5F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==18805==    by 0x400858: addit (main.c:29)
==18805==    by 0x400C33: main (main.c:79)
==18805== 
==18805== LEAK SUMMARY:
==18805==    definitely lost: 56 bytes in 1 blocks
==18805==    indirectly lost: 0 bytes in 0 blocks
==18805==      possibly lost: 0 bytes in 0 blocks
==18805==    still reachable: 0 bytes in 0 blocks
==18805==         suppressed: 0 bytes in 0 blocks
==18805== 
==18805== For counts of detected and suppressed errors, rerun with: -v
==18805== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

Ultima modifica di marilynm69 : 09-04-2018 alle 15:16.
marilynm69 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Le novità MSI del 2026 per i videogiocatori Le novità MSI del 2026 per i videogiocato...
I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers I nuovi schermi QD-OLED di quinta generazione di...
Prosegue lo sviluppo del telescopio spaz...
28 astronauti cinesi hanno condotto un'e...
Dal Padiglione Italia al mercato globale...
POCO M8: display AMOLED luminoso, batter...
ECOVACS, tante novità a Las Vegas...
Caso Galaxy Ring difettoso: Samsung chiu...
Targa e assicurazione per monopattini el...
AI Cloud Protect: la soluzione di Check ...
Nuovo spettacolare video del razzo spazi...
Hisense presenta a CES 2026 il display M...
XPeng P7+ è pronta per l'Europa: ...
IKEA nuove lampade Matter annunciate al ...
Il telescopio Hubble potrebbe andare dis...
Hisense introduce RGB MiniLED evo (a qua...
Deumidificatore De'Longhi in offerta su ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:38.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v
Hardware Upgrade Forum Database Error
Database Error Database error
The Hardware Upgrade Forum database has encountered a problem.

Please try the following:
  • Load the page again by clicking the Refresh button in your web browser.
  • Open the www.hwupgrade.it home page, then try to open another page.
  • Click the Back button to try another link.
The www.hwupgrade.it forum technical staff have been notified of the error, though you may contact them if the problem persists.
 
We apologise for any inconvenience.