Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > it.comp.os.linux.development > #67
| From | guido84 <guido84@invalid.invalid> |
|---|---|
| Newsgroups | it.comp.os.linux.development |
| Subject | Re: Spreco di memoria e minaccia alla sicurezza |
| Date | 2017-06-12 14:57 +0000 |
| Organization | Aioe.org NNTP Server |
| Message-ID | <ohma5d$fvf$1@gioia.aioe.org> (permalink) |
| References | <ohm0ck$1rf6$1@gioia.aioe.org> <eq7l5jF9dpaU1@mid.individual.net> |
Il 12/6/2017 16:01:23 Alessandro Pellizzari scrisse:
>On 12/06/17 13:11, guido84 wrote:
>> Allora astutissimamente gli ho messo:
>> char pippo[1];
>> adesso niente Warning e funzionamento sempre perfetto, anche con
>> stringhe lunghissime.
>Questo perche`, per efficienza, Linux alloca memoria in blocchi di
>dimensione fissa (mi pare 4k), quindi finche` i tuoi dati stanno dentro
>il blocco, e tu eccedi nell'ultima variabile dichiarata, va tutto bene.
>Ma gia` se provi a fare
>char pippo[1];
>char pluto[1];
>Scrivendo oltre il limite di pippo rischi di sovrascrivere pluto.
TNX! questa me la faccio piu' tardi, voglio fargli sovrascrivere
pluto (ma 4k sono veramente moltissmi, glieli daro' da file).
>> allora dico: perche' mai nel libro che ho non fanno altro che
>> scrivere in continuazione "char pippo[81];" ?
>> Non sarebbe il caso di mettere SEMPRE "char pippo[1];" ?
>No. Vedi sopra.
>Il modo giusto e` usare malloc per allocare la memoria che ti serve, e
>poi verificare di volta in volta che non la stai eccedendo.
>A quel punto pippo diventa davvero un puntatore a un'area dinamica di
>memoria, e lo puoi dichiarare con
>char *pippo;
Per imparare le funzioni e poi saperle usare, per atoi() ho
cercato di poter dargli la stringa in input:
1. da argv[1], ormai facile: ./prova 111
2. col comando echo, unico modo: ./prova $(echo 111)
3. passandogliela con una pipe: echo 111 | ./prova -
Per fare il 3 (tralasciando per il momento che non so fargli
distinguere "-" da qualsiasi altro carattere diverso da cifre),
non posso (mi sembra!) usare malloc, perche' scanf() non me lo
puo' dire quanto e' lunga prima di riceverla. E per riceverla
deve avere un posto-vettore dove metterla... insomma: il gatto
che si mangia la coda. Percio' ho trovato l'escamotage di pippo[0]
(adesso ho visto che prende anche lo zero).
Ecco il codice.
------
#include <stdio.h>
#include <string.h>
int atoi(char *origine);
char dapipe[0];
int main(int argc, char** argv)
{
int arg1, arg2;
// ./prova (per l'help)
if (argc == 1)
{
printf("\033[33mUsage: Stringa di arg1 in numero allo stdout \033[m \n");
}
else
{
arg1 = atoi(argv[1]);
// echo 123 | ./prova -
if (arg1 == 0)
{
scanf("%s", dapipe);
arg2 = atoi(dapipe);
printf("%d\n", arg2);
}
// Caso ordinario
else
{
printf("%d\n", arg1);
}
}
return 0;
}
----------------
--
Saluti,
Guido
Back to it.comp.os.linux.development | Previous | Next — Previous in thread | Next in thread | Find similar
Spreco di memoria e minaccia alla sicurezza guido84 <guido84@invalid.invalid> - 2017-06-12 12:11 +0000
Re: Spreco di memoria e minaccia alla sicurezza Alessandro Pellizzari <shuriken@amiran.it> - 2017-06-12 15:01 +0100
Re: Spreco di memoria e minaccia alla sicurezza guido84 <guido84@invalid.invalid> - 2017-06-12 14:57 +0000
Re: Spreco di memoria e minaccia alla sicurezza Alessandro Pellizzari <shuriken@amiran.it> - 2017-06-12 17:14 +0100
Re: Spreco di memoria e minaccia alla sicurezza enoquick <enoquick@gmail.com> - 2017-06-12 21:40 -0500
Re: Spreco di memoria e minaccia alla sicurezza guido84 <guido84@invalid.invalid> - 2017-06-13 07:28 +0000
Re: Spreco di memoria e minaccia alla sicurezza Alessandro Pellizzari <shuriken@amiran.it> - 2017-06-13 10:16 +0100
csiph-web