OVH Cloud OVH Cloud

déclaration tableau C99 taille variable

36 réponses
Avatar
Nicolas Aunai
salut,

je viens d'apprendre avec surprise que je peux faire :

int tab[x]; avec x une variable dont la valeur est acquise pendant
l'execution...


moi qui banissais totalement ce genre de chose, et hurlais après qqn
dès que je le voyais faire ça... je ne sais plus quoi penser...

pourquoi a-t-on permi ça en dans la norme C99 ?

si x est mal controlé dans mon programme, genre si a un moment j'ai
x=319391929919291929, ça me parait très dangereux


explications ?

--
Nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@hotmail.com

10 réponses

1 2 3 4
Avatar
DINH Viêt Hoà

Marc Boyer écrit:
Ah... Je vois l'ampleur du problème...


Ça a tendance à faire une violation de segment, qui est
interuptible. Dans ce cas il vaut mieux quitter proprement. Un peu
comme quand malloc renvoie NULL.


Effectivement, dans le man solaris, on trouve :

<<
Undefined results will occur if the size requested for a block of mem-
ory exceeds the maximum size of a process's heap, which can be obtained
with getrlimit(2)




et sur le man linux :

<<
On many systems alloca cannot be used inside the list of arguments of a
function call, because the stack space reserved by alloca would appear
on the stack in the middle of the space for the function arguments.




bref, des comportements un peu indéfinis partout !

--
DINH V. Hoa,

"s/^((.|[^[]|[(^.|[^^])[^]]*])*)([^*[])/14/"
-- Stéphane CHAZELAS


Avatar
Marc Boyer
Laurent Wacrenier wrote:
Marc Boyer écrit:
Ah... Je vois l'ampleur du problème...


Ça a tendance à faire une violation de segment, qui est
interuptible. Dans ce cas il vaut mieux quitter proprement. Un peu
comme quand malloc renvoie NULL.


Sauf que, un échec de malloc, à ma connaissance, il ne brise
pas le flot de controle du programme, et on peut donc avoir
assez facilement une idée de l'état du programme, et de
ce qu'il y a à faire pour quitter proprement, alors qu'avec
une interuption, c'est plus dur. Non ?

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(


Avatar
DINH Viêt Hoà

Sauf que, un échec de malloc, à ma connaissance, il ne brise
pas le flot de controle du programme, et on peut donc avoir
assez facilement une idée de l'état du programme, et de
ce qu'il y a à faire pour quitter proprement, alors qu'avec
une interuption, c'est plus dur. Non ?


<context mode="j'ai 2 de QI">
je n'ai pas compris ce que tu voulais dire. Pourrais-tu reformuler ?
</context>

--
DINH V. Hoa,

"s/^((.|[^[]|[(^.|[^^])[^]]*])*)([^*[])/14/"
-- Stéphane CHAZELAS

Avatar
Marc Boyer
DINH Viêt Hoà wrote:
je n'ai pas compris ce que tu voulais dire. Pourrais-tu reformuler ?
#ifdef PILE

#define alloc(X) alloca(X)
#else
#define alloc(X) malloc(X)
#endif

void foo(...){
FILE* f=open(...);
char* c=alloc(...);
bar(...);
...
close(f);
}
void bar(...){
FILE* b=open(...);
char* c=alloc(...);
...
close(b);
}

Si j'utilise malloc, il est assez facile de savoir quels
fichiers je dois fermer: je sais ou je suis dans le flot
de controle. Si je dois passer par un signal, j'ai plus
de mal a savoir quelles ressources ont été acquises,
lesquelles je dois libérer, etc.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
espie
In article <bpcngb$41i$,
Marc Boyer wrote:
Marc Espie wrote:
Ca permettra d'eviter l'abus de alloca(), fonction encore plus dangereuse,
non standard, et qui nuit fortement a la sante.


Mais alloca a quand même la gentillesse de signaler
son échec à ma connaissance.


Ah oui, et quand l'echec c'est `il n'y a pas d'alloca sur ce systeme',
et que tu en as un toutes les trois lignes, eh bien tu jettes le programme
et tu passes au suivant.


Avatar
Marc Boyer
Marc Espie wrote:
Mais alloca a quand même la gentillesse de signaler
son échec à ma connaissance.


Ah oui, et quand l'echec c'est `il n'y a pas d'alloca sur ce systeme',
et que tu en as un toutes les trois lignes, eh bien tu jettes le programme
et tu passes au suivant.


[inline] void* alloca(size_t s){ return malloc(s); }

Non ?

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(


Avatar
DINH Viêt Hoà

Ah oui, et quand l'echec c'est `il n'y a pas d'alloca sur ce systeme',
et que tu en as un toutes les trois lignes, eh bien tu jettes le programme
et tu passes au suivant.


[inline] void* alloca(size_t s){ return malloc(s); }


et un inline automatic_call void freea(s) { free(s) } ?

--
DINH V. Hoa,

"s/^((.|[^[]|[(^.|[^^])[^]]*])*)([^*[])/14/"
-- Stéphane CHAZELAS


Avatar
Marc Boyer
In article , DINH Viêt Hoà wrote:

Ah oui, et quand l'echec c'est `il n'y a pas d'alloca sur ce systeme',
et que tu en as un toutes les trois lignes, eh bien tu jettes le programme
et tu passes au suivant.


[inline] void* alloca(size_t s){ return malloc(s); }


et un inline automatic_call void freea(s) { free(s) } ?


Heu.. Disons que j'avais rien dit, et que j'ai anticipé
sur mon stock de grosses bourdes du vendredi après-midi.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(



Avatar
espie
In article <bpd6o9$7eg$,
Marc Boyer wrote:
In article , DINH Viêt Hoà wrote:

Ah oui, et quand l'echec c'est `il n'y a pas d'alloca sur ce systeme',
et que tu en as un toutes les trois lignes, eh bien tu jettes le programme
et tu passes au suivant.


[inline] void* alloca(size_t s){ return malloc(s); }


et un inline automatic_call void freea(s) { free(s) } ?


Heu.. Disons que j'avais rien dit, et que j'ai anticipé
sur mon stock de grosses bourdes du vendredi après-midi.


C'est pas pour dire, mais la tu viens d'utiliser tout ton stock
de grosses bourdes du mois. D'ailleurs, celle-la, on va avoir du
mal a la sortir du newsgroup: elle passe pas la porte. ;-)




Avatar
Gabriel Dos Reis
Marc Boyer writes:

| Marc Espie wrote:
| > Ca permettra d'eviter l'abus de alloca(), fonction encore plus dangereuse,
| > non standard, et qui nuit fortement a la sante.
|
| Mais alloca a quand même la gentillesse de signaler
| son échec à ma connaissance.

Ah bon ? Tu as essayé ?

-- Gaby
1 2 3 4