Discussione:
allocazioni anonime
(troppo vecchio per rispondere)
jak
2022-07-19 08:48:58 UTC
Permalink
Ciao,
avevo scritto un funzioncina per poter visualizzare/stampare i bit di
una variabile numerica, poi ho avuto l'esigenza di poterla utilizzare
con variabili di diversa tipologia e, non avendo a disposizione gli
overload del c++ ho pensato di trasformarla in una macro-function.
Premetto che il codice non è che una bozza, quindi mi piacerebbe che non
vi fossilizzaste sullo stile o in relazione alla portabilità ma vi
limitaste alla domanda che vi vorrei porgere. Il codice per il quale
vorrei porgere la domanda è questo:

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #if !defined(CHAR_BIT)
6 #include <limits.h>
7 #endif
8 #define len(n) (sizeof(n) * CHAR_BIT)
9 #define bit2str(n) ({ \
10 char * const s = (char[len(n) + 1]){}, \
11 *p = &s[len(n) - 1]; \
12 s[len(n)] = '\0'; \
13 for(size_t i = 0; i < len(n); i++) \
14 p[-i] = ((n) >> i & 1)[(char[]){'0', '1'}]; \
15 s; \
16 })
17
18 int main(void)
19 {
20 long long number = 0x8000000180AAAA01;
21 char *s = bit2str(number), *p = malloc(1000);
22
23 if(p)
24 {
25 strcpy(p, s);
26 printf("\nsizeof char: %d", (int)sizeof(char));
27 printf("\nsizeof short: %d", (int)sizeof(short));
28 printf("\nsizeof int: %d", (int)sizeof(int));
29 printf("\nsizeof long: %d", (int)sizeof(long));
30 printf("\nsizeof long long: %d", (int)sizeof(long long));
31 printf("\n");
32 printf("\ns: %s", s);
33 printf("\np: %s", p);
34 printf("\n");
35 }
36 exit(0);
37 }

Premetto che le linee da 25 a 31, come l'uso della malloc per la heap,
sono state aggiunte all'unico scopo di produrre sconquasso nello stack
nella speranza che si piantasse.
Se alla linea 10 dichiarassi 's' come array questo programmino non
funzionerebbe perché terminerebbe il file scope dell'array, allora in un
momento di follia ho sostituito tale allocazione con una anonima. Potrei
crare uno spazio statico fisso di dimensione della stringa della massima
dimensione necessaria per la rappresentazione oppure allocarla
dinamicamente e poi liberarla successivamente. Metodi ce ne sono
parecchi e la fantasia non manca ma, quando ho tentato con l'allocazione
anonima ho scoperto, con meraviglia, che funziona ma la domanda, anzi,
le domanda sono:
- perché fuunziona?- funziona per caso oppure ha senso che funzioni?
- quando verrà liberata quella memoria? solo al termine del programma?
- se usassi quella macro in un loop arriverò a terminare la memoria
allocabile?
Aggiungo che mi piacerebbe ricevere spiegazioni e non opinioni.

Grazie per l'attenzione.
jak
2022-07-19 09:03:29 UTC
Permalink
Post by jak
Ciao,
avevo scritto un funzioncina per poter visualizzare/stampare i bit di
una variabile numerica, poi ho avuto l'esigenza di poterla utilizzare
con variabili di diversa tipologia e, non avendo a disposizione gli
overload del c++ ho pensato di trasformarla in una macro-function.
Premetto che il codice non è che una bozza, quindi mi piacerebbe che non
vi fossilizzaste sullo stile o in relazione alla portabilità ma vi
limitaste alla domanda che vi vorrei porgere. Il codice per il quale
  1  #include <stdio.h>
  2  #include <stdlib.h>
  3  #include <string.h>
  4
  5  #if !defined(CHAR_BIT)
  6  #include <limits.h>
  7  #endif
  8  #define len(n)  (sizeof(n) * CHAR_BIT)
  9  #define bit2str(n) ({                               \
 10      char * const s = (char[len(n) + 1]){},          \
 11           *p = &s[len(n) - 1];                       \
 12      s[len(n)] = '\0';                               \
 13      for(size_t i = 0; i < len(n); i++)              \
 14          p[-i] = ((n) >> i & 1)[(char[]){'0', '1'}]; \
 15      s;                                              \
 16  })
 17
 18  int main(void)
 19  {
 20      long long number = 0x8000000180AAAA01;
 21      char *s = bit2str(number), *p = malloc(1000);
 22
 23      if(p)
 24      {
 25          strcpy(p, s);
 26          printf("\nsizeof char:      %d", (int)sizeof(char));
 27          printf("\nsizeof short:     %d", (int)sizeof(short));
 28          printf("\nsizeof int:       %d", (int)sizeof(int));
 29          printf("\nsizeof long:      %d", (int)sizeof(long));
 30          printf("\nsizeof long long: %d", (int)sizeof(long long));
 31          printf("\n");
 32          printf("\ns: %s", s);
 33          printf("\np: %s", p);
 34          printf("\n");
 35      }
 36      exit(0);
 37  }
Premetto che le linee da 25 a 31, come l'uso della malloc per la heap,
sono state aggiunte all'unico scopo di produrre sconquasso nello stack
nella speranza che si piantasse.
Se alla linea 10 dichiarassi 's' come array questo programmino non
funzionerebbe perché terminerebbe il file scope dell'array, allora in un
momento di follia ho sostituito tale allocazione con una anonima. Potrei
crare uno spazio statico fisso di dimensione della stringa della massima
dimensione necessaria per la rappresentazione oppure allocarla
dinamicamente e poi liberarla successivamente. Metodi ce ne sono
parecchi e la fantasia non manca ma, quando ho tentato con l'allocazione
anonima ho scoperto, con meraviglia, che funziona ma la domanda, anzi,
- perché fuunziona?- funziona per caso oppure ha senso che funzioni?
- quando verrà liberata quella memoria? solo al termine del programma?
- se usassi quella macro in un loop arriverò a terminare la memoria
allocabile?
Aggiungo che mi piacerebbe ricevere spiegazioni e non opinioni.
Grazie per l'attenzione.
Ops, ho scritto "file scope" anziché "life scope", sorry.
jak
2022-07-19 16:10:03 UTC
Permalink
Post by jak
Ciao,
avevo scritto un funzioncina per poter visualizzare/stampare i bit di
una variabile numerica, poi ho avuto l'esigenza di poterla utilizzare
con variabili di diversa tipologia e, non avendo a disposizione gli
overload del c++ ho pensato di trasformarla in una macro-function.
Premetto che il codice non è che una bozza, quindi mi piacerebbe che non
vi fossilizzaste sullo stile o in relazione alla portabilità ma vi
limitaste alla domanda che vi vorrei porgere. Il codice per il quale
  1  #include <stdio.h>
  2  #include <stdlib.h>
  3  #include <string.h>
  4
  5  #if !defined(CHAR_BIT)
  6  #include <limits.h>
  7  #endif
  8  #define len(n)  (sizeof(n) * CHAR_BIT)
  9  #define bit2str(n) ({                               \
 10      char * const s = (char[len(n) + 1]){},          \
 11           *p = &s[len(n) - 1];                       \
 12      s[len(n)] = '\0';                               \
 13      for(size_t i = 0; i < len(n); i++)              \
 14          p[-i] = ((n) >> i & 1)[(char[]){'0', '1'}]; \
 15      s;                                              \
 16  })
 17
 18  int main(void)
 19  {
 20      long long number = 0x8000000180AAAA01;
 21      char *s = bit2str(number), *p = malloc(1000);
 22
 23      if(p)
 24      {
 25          strcpy(p, s);
 26          printf("\nsizeof char:      %d", (int)sizeof(char));
 27          printf("\nsizeof short:     %d", (int)sizeof(short));
 28          printf("\nsizeof int:       %d", (int)sizeof(int));
 29          printf("\nsizeof long:      %d", (int)sizeof(long));
 30          printf("\nsizeof long long: %d", (int)sizeof(long long));
 31          printf("\n");
 32          printf("\ns: %s", s);
 33          printf("\np: %s", p);
 34          printf("\n");
 35      }
 36      exit(0);
 37  }
Premetto che le linee da 25 a 31, come l'uso della malloc per la heap,
sono state aggiunte all'unico scopo di produrre sconquasso nello stack
nella speranza che si piantasse.
Se alla linea 10 dichiarassi 's' come array questo programmino non
funzionerebbe perché terminerebbe il file scope dell'array, allora in un
momento di follia ho sostituito tale allocazione con una anonima. Potrei
crare uno spazio statico fisso di dimensione della stringa della massima
dimensione necessaria per la rappresentazione oppure allocarla
dinamicamente e poi liberarla successivamente. Metodi ce ne sono
parecchi e la fantasia non manca ma, quando ho tentato con l'allocazione
anonima ho scoperto, con meraviglia, che funziona ma la domanda, anzi,
- perché fuunziona?- funziona per caso oppure ha senso che funzioni?
- quando verrà liberata quella memoria? solo al termine del programma?
- se usassi quella macro in un loop arriverò a terminare la memoria
allocabile?
Aggiungo che mi piacerebbe ricevere spiegazioni e non opinioni.
Grazie per l'attenzione.
risolto. grazie lo stesso.

Continua a leggere su narkive:
Loading...