Operador de endereço com endereço da matriz em C? [Resolvido]

5 respostas
PhoenixWings

Boa tarde gente. Como todos sabem, não se deve colocar o operador de endereço ( & ) para endereçar uma matriz, já que o nome da matriz já é um endereço. Porém, no código abaixo, eu só consigo obter o nome do cômodo pela segunda vez utilizando o operador ( se eu não utilizá-lo, esta instrução é “pulada”). Já tentei usar gets no lugar do scanf e mesmo assim ela é ignorada. Como isso se explica? usar o operador de endereço para endereçar um endereço já endereçado? e por que eu só consigo obter pela segunda vez o nome do cômodo se eu fizer uso de scanf("%s", &comodo); ? obrigado pela ajuda!

/* 
 * File:   arearesidencia.c
 * Author: phoenix
 *
 * Created on 4 de Junho de 2010, 09:44
 */

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
/*
 * 
 */
int main(int argc, char** argv) {

    float largura = 0, comprimento = 0, totarea = 0;
    char comodo[20];
    char ch;
    
    while(ch != 'N') {

     printf("Informe o nome do comodo: ");
     scanf("%s", &comodo); // só obtém o nome do cômodo na segunda inserção se eu usar &comodo
     
     printf("Insira a largura desse comodo: ");
     scanf("%f", &largura);
     
     printf("Insira o comprimento do comodo: ");
     scanf("%f", &comprimento);
     
     printf("\nArea do comodo escolhido: %.2f\n", largura * comprimento);
     
     totarea += largura * comprimento;
     
     puts("deseja escolher outro comodo (s/n)? ");
     ch = toupper(getche()); 
     printf("\n");
   }  
 
     printf("\n\nArea total da residencia: %.2f\n", totarea);
     system("PAUSE");
  }

5 Respostas

luciano2

Tem certeza? oque acontece quando você passar sem o operador &?

peczenyj

quando vc faz

x ja é um ponteiro (e aponta para o primeiro elemento, o x[0]), logo o que vc quer fazer é passar x e não &x.

no caso de ponteiro de char, também chamado de strings no mundo C, vale a mesma coisa. As funções que manipulam strings ja sabem disso e recebem o ponteiro para o começo da cadeia e iteram até um \0 – por esta razão C é vulnerável a buffer overflow, strings e arrays não tem um tamanho associado a variavel, vc vai iterando e tem que informar o tamanho ou alguma regra de marcação para sinalizar o fim (como o \0 no final da string).

Por fim, tome cuidado com scanf lendo strings :wink:

J

O peczenyj tem razão. Quando voce declara

char x[40];

você já possui uma referencia a uma area de memória e uma leitura com &x pode fazer você gravar em uma área de memória desconhecida e até danificar outros programas.

A maioria dos compiladores avisam quando você comete esse erro. Qual compilador você está usando?

O correto seria ler sem o marcador de endereço,

ou utilizar um ponteiro previamente inicializado char *x = NULL, e ler sem o marcador de endereço novamente.

Estranho o seu programa não ler sem o &.


PhoenixWings

juliocbq:
O peczenyj tem razão. Quando voce declara

char x[40];

você já possui uma referencia a uma area de memória e uma leitura com &x pode fazer você gravar em uma área de memória desconhecida e até danificar outros programas.

Concordo com tudo o que todos disseram e fiquei surpreso ao ver que a instrução sem o ‘&’ está funcionando adequadamente pela segunda vez. Eu estou usando o dev-c++. Pelo visto, parece problema do compilador. Eu já sabia que o certo era referenciar o nome de uma matriz sem o & ( pois como foi dito, o nome da matriz já é o endereço ) porém, não sei o porquê do dev-c ++ não estar “deixando” eu inserir o nome do cômodo pela segunda vez quando eu referencio apenas o nome da matriz.
Acabei de tirar o operador de endereço para fazer uso da instrução scanf("%s", comodo); e agora deu certo! juro que eu já tinha tentado essa instrução anteriormente e não estava dando certo. Existe alguma explicação para isso? a instrução scanf("%s", &comodo); teve um efeito mágico anterior? :shock: Obrigado pela atenção!

peczenyj

As vezes, em C, os programas compilam e funcionam de forma inesperada pela nossa falta de experiência e por alguns truques que o compilador queira fazer baseado no que a gente inseriu no codigo.

Criado 4 de junho de 2010
Ultima resposta 4 de jun. de 2010
Respostas 5
Participantes 4