• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Ziwdon

gcc...bug???

17 mensagens neste tópico

Ok...isto é muito esquisito.

Peço-vos o seguinte:

Compilem este código e executem-no.

Depois coloquem aqui o output...e metam também o vosso compilador (gcc ou não).

#include <stdio.h>

int main(void) {

int array[2];
array[0] = 1;
array[1] = 9;
array[2] = 9;
int size = 3;

int n;
for (n=0; n<size; n++) {
	printf("%d\n", array[n]);
}
getchar();

return 0;
}

Já agora se virem algum erro (que eu não estou a ver) avisem.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando fazes isto:

array[2] = 9;

o valor não é guardado e no ciclo for quando acedes à terceira posição (n=2) estoura. :D

Declaras-te o array com 2 posições mas não te esqueças que só podes a ceder a array[0] e array[1].

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hmm...então o array[2] = '\0' ?

array[2] = LIXO :)

Ao declarares array[2] só podes aceder a array[0] e array[1]. Lembra-te declaras um array com duas posições, e em C a contagem começa por 0.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim eu sei que a contagem começa por 0 mas nao sabia que nao podia aceder a array[2]...ou então estou a fazer confusao.

E se fosse um array de caracteres? nesse caso o array[2] já seria '\0' ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não pah, é o que já te foi dito. Seja que array for, começa do 0 e tem x posições que definiste ao declarar o array.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim eu sei que a contagem começa por 0 mas nao sabia que nao podia aceder a array[2]...ou então estou a fazer confusao.

E se fosse um array de caracteres? nesse caso o array[2] já seria '\0' ?

Independentemente do tipo de dados do array, quando declaras que um array só tem duas posições só podes aceder a essas duas. Acederes a posições fora dos limites do array é um erro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hmm...ok...estou confuso. Estava convencido que quando declaravamos um array, o seu tamanho era sempre o declarado mais um. Ou seja array[9] teria 10 posiçoes. É que me lembro mesmo de me terem dito isso numa aula qualquer.

Ainda por cima o programa nem sequer estoirou, e o problema esta mesmo em size=3, nao tanto em array[2]=9. Em vez de avisar que estamos a passar o limite, o programa imprime "1 9 3".

Anyway...estou esclarecido.

Obrigado

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Buttpt, faz o seguinte, em vez de teres o código como tinhas põe antes assim:

#include <stdio.h>

int main(void) {

int array[2];
array[0] = 1;
array[1] = 9;
int size = 3;
array[2] = 9;

int n;
for (n=0; n<3; n++) {
	printf("%d\n", array[n]);
}
getchar();

return 0;
}

Muito provavelmente irá te imprimir "1 9 9".

Ou seja, o facto de não te ter dado SIGSEGV é porque ao acederes à posição fora do array estás a aceder por acaso a uma posição de memória que faz parte do teu programa, que será a variável "size". Espero que dê para perceberes o que está a acontecer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Buttpt, faz o seguinte, em vez de teres o código como tinhas põe antes assim:

#include <stdio.h>

int main(void) {

int array[2];
array[0] = 1;
array[1] = 9;
int size = 3;
array[2] = 9;

int n;
for (n=0; n<3; n++) {
	printf("%d\n", array[n]);
}
getchar();

return 0;
}

Muito provavelmente irá te imprimir "1 9 9".

Ou seja, o facto de não te ter dado SIGSEGV é porque ao acederes à posição fora do array estás a aceder por acaso a uma posição de memória que faz parte do teu programa, que será a variável "size". Espero que dê para perceberes o que está a acontecer.

Sim tens razão. Assim corre bem.

Obg.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, não corre bem. Eu pus esse código para veres o que está a acontecer nos "bastidores". Aliás se reparares eu alterei o "for" para em vez de usar o "size" usar antes "3". Porque se usasse "size" iria iterar 9 vezes o que então iria realmente craxar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, não corre bem. Eu pus esse código para veres o que está a acontecer nos "bastidores". Aliás se reparares eu alterei o "for" para em vez de usar o "size" usar antes "3". Porque se usasse "size" iria iterar 9 vezes o que então iria realmente craxar.

Sim eu sei lol. Eu quis dizer que corria bem porque aparecia "1 9 9". Ainda assim está errado.

Eu reparei nisso do "3"...e experimentei size. Nao deu.

Ja agora...porque é que nao podemos fazer

int size = 10;
int array[size] = {9, 2};

Temos que declarar size como uma constante?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

para criares memoria em tempo de execucao tens de usar o malloc.

quando dizes que queres criar um array de uma determinada dimensão tens duas maneiras uma é criares da maneira que tens criado outra e criares usando a funcao malloc (memory allocation ).

quando estas a criar um array da maneira que pretendes tens de dizer ao compilador qual e o tamanho que ele deve dizer ao executavel para alocar em memoria, e por isso esse valor nunca deve mudar dai a razao para ter de ser constante.

como estas a usar uma variavel como o proprio nome indica podes fazer variar o valor dessa variavel entao o compilador nao saberia dizer ao executavel qual o valor correcto .

esta explicacao que te fiz e muito simplista na realidade nao é bem como te estou a dizer .... mas acho que pelo menos assim ficas um pouco elucidado

boas programacoes

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a diferença entre malloc/calloc e a declaraçao normal e a zona de memoria que estas a usar. malloc aloca na heap e declaraçao normal usa o stack. tas a aceder a zonas de memoria interditas...acrescenta mais uma casa ao array e fica resolvido

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora