Ir ao conteúdo
  • Cadastre-se

C Receber o endereço de memória de um char _error_


Posts recomendados

Quero pegar o endereço de memoria da variável char[15] do registro para poder apontar para o valor e imprimir. Não existe uma forma? Eu sei que consigo fazer isso sem apontar.

 

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct estrutura {
	int id;
	char cores[15];
};

int main() {
	int *ptr;
	char *ptr_s;	
	struct estrutura lapis[3];

	for (int i = 0; i < 3; i++) {
		lapis[i].id = i+1;
		if ( i == 0 ) {
			strcpy(lapis[i].cores, "vermelho");
		} else if ( i == 1 ) {
			strcpy(lapis[i].cores, "amarelo");
		} else {
			strcpy(lapis[i].cores, "verde");
		}
	}
	
	for (int i = 0; i < 3; i++) {
		ptr = &lapis[i].id;
		printf("Valor de id %d = %d   -   ", i ,*ptr);
		//não consegui nem com strcpy();
		ptr_s = &lapis[i].cores;
		printf("Cor: %s\n\n", *ptr_s);
	}
	
	system("Pause");
	return(0);
}

 

 

O trecho em específico:

    ptr_s = &lapis[i].cores;
    printf("Cor: %s\n\n", *ptr_s);

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Luiz Paulo Escobar

27 minutos atrás, Luiz Paulo Escobar disse:

O trecho em específico:


    ptr_s = &lapis[i].cores;
    printf("Cor: %s\n\n", *ptr_s);

Você pode omitir o & ou então fazer ptr_s apontar para o primeiro elemento da string cores manualmente:

ptr_s = lapis[i].cores;

// Ou

ptr_s = &lapis[i].cores[0];

E chamando a printf() daquela forma, sabe o que será impresso? O caractere na posição 0 da string cores, pois esse é o conteúdo apontado pelo ponteiro naquele momento.

Omitimos então o operador *, veja:

printf("Cor: %s\n\n", ptr_s);

Assim printf() imprime na saída até que seja encontrado um caractere nulo.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues bem esclarecedor

@mauro_b obrigado

17 minutos atrás, Lucca Rodrigues disse:

ptr_s = &lapis[i].cores[0];

Em C cada espaço do vetor tem um endereço?

3 minutos atrás, Luiz Paulo Escobar disse:

ptr_s = &lapis[i].cores[0];

No caso então eu teria que printar o valor de endereço por endereço até o numero maximo do vetor (strlen)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Luiz Paulo Escobar disse:

Em C cada espaço do vetor tem um endereço?

 

Como em qualquer linguagem. Mesmo que você não possa acessar ou saber qual é.
 

1 hora atrás, Luiz Paulo Escobar disse:

endereço de memoria da variável char[15] do registro

 

char[15] não é uma variável. É um tipo. A variável é cores e o tipo dela é char[15].

 

struct estrutura {
	int id;
	char cores[15];
};

 

está declarada dentro de estrutura e o compilador vai reservar um espaço para ela no código, fixo, de tamanho necessário para conter 15 char. E esse endereço vai ser o endereço de início do vetor, cores.

 

Nunca declare essas coisas fora de main() ou fora de qualquer função. Isso faz com que a estrutura toda seja global, válida no programa todo. E isso praticamente NUNCA é o que você quer. Só dá problema e é proibido em toda parte.

 

E como está já declarada em geral não há razão para querer saber o endereço dela. É fixo e constante e pode ser obtido usando o operador & que retorna o endereço de qualquer coisa em C.

 

Se quer apenas imprimir algum dos 15 pode usar a única coisa que C faz com vetores e matrizes: calcular o deslocamento a partir do início. De cores[0] até cores[14] estarão as letras.

 

Uma string em C tem um zero no fim. Isso quer dizer que se tem uma string em cores pode imprimir direto usando %s na especificação do printf(). Ou pode escrever puts(cores) para ver na tela.

 

Se quer imprimir 1 a 1 use claro um loop, for, while, do/while, goto, qualquer um.

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

@Luiz Paulo Escobar

2 horas atrás, Luiz Paulo Escobar disse:

Em C cada espaço do vetor tem um endereço?

Declaramos, por exemplo:

int vet[10];

Reservamos então um conjunto de espaços de memória de modo a conter 10 inteiros.

Para se referir a um certo elemento do vetor, basta indexa-lo:

vet[0] = 1;

Então a resposta da sua pergunta é sim, se tratando de um conjunto, cada elemento tem um endereço.

 

2 horas atrás, Luiz Paulo Escobar disse:

No caso então eu teria que printar o valor de endereço por endereço até o numero maximo do vetor (strlen)

Se sua variável é uma string, então ela é terminada em '\0', ou caractere nulo.

printf() irá imprimi-la até encontrar esse caractere, essa é a razão pela qual você consegue imprimir uma string sem um loop, mas não consegue fazer o mesmo com um vetor de inteiros por exemplo, já que este não tem um terminador, a não ser que você coloque um lá, e mesmo assim precisará de um loop.

ptr_s aponta para o início de uma string, não há razão em imprimir elemento por elemento.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, arfneto disse:

Se quer imprimir 1 a 1 use claro um loop, for, while, do/while, goto, qualquer um.

vou agilizar isso

No caso, vocês me esclareceram o que eu queria fazer, obrigado!

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct estrutura {
	int id;
	char cores[15];
};

int main() {
	int *ptr;
	char *ptr_c, *ptr_s;	
	struct estrutura lapis[3];

	for (int i = 0; i < 3; i++) {
		lapis[i].id = i+1;
		if ( i == 0 ) {
			strcpy(lapis[i].cores, "vermelho");
		} else if ( i == 1 ) {
			strcpy(lapis[i].cores, "amarelo");
		} else {
			strcpy(lapis[i].cores, "verde");
		}
	}
	
	for (int i = 0; i < 3; i++) {
		ptr = &lapis[i].id;
		printf("Valor de id %d = %d   -   ", i ,*ptr);
		ptr_s = lapis[i].cores;
		
		//aqui irei imprimeiro endereço por endereço
		printf("Cor: ");
		for (int j = 0; j < strlen(ptr_s); j++ ) {
			ptr_c = &lapis[i].cores[j];
			printf("%c", *ptr_c);
		}
		printf("\n");
	}
	
	system("Pause");
	return(0);
}

 

Link para o comentário
Compartilhar em outros sites

:)

 

Muito bem.

 

Mas ainda não está bom. Não use uma estrutura global. Nunca.

 

Não aloque nada fora das funções. Em muitas linguagens sequer é possível. Isso é problema.

 

Vou deixar um exemplo de como seria um programa para fazer a mesma coisa do modo como deve encontrar em programas modernos em produção, e sugiro que compare a mecânica.

 

Antes de tudo entenda que seu programa não cria nada: ao ser compilado já se sabe o que vai acontecer: os valores são constantes. Os loops sempre vão dar o mesmo resultado. Então deve ser possível o compilador já fazer isso ao invés de rodar código TODA vez que roda o programa para gerar SEMPRE o mesmo resultado.

 

A saída do exemplo

 


clube>gcc -o tst -Wall -std=c17 ch0520ptr.c
clube>./tst

Valor do ultimo id usando o ponteiro = 3
Valor do ultimo id usando a variável = 3

Valor da segunda cor usando o ponteiro para char= verde
Valor da segunda cor usando o ponteiro para estrutura = verde
Valor da segunda cor usando a variável = verde

Valor da cor na estrutura usando a variavel = doze x
Valor da cor na estrutura usando o ponteiro para char = doze x
clube>

 

O código

 

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct
{
	int     id;
	char    cores[15];

}   Estrutura;

int main(void)
{

Estrutura estrutura = { .id = 1432, .cores = "doze x" };

Estrutura lapis[3] =
{
    [0] = { .id = 1, .cores = "vermelho" },
    [2] = { .id = 3, .cores = "verde"    },
    [1] = { .id = 2,.cores = "amarelo"   }
};


    // usando ptr para acessar a ultima id do vetor lapis
    int*        ptr = &lapis[2].id; // usando o operador &
    printf("\nValor do ultimo id usando o ponteiro = %d\n", *ptr);
    printf("Valor do ultimo id usando a variável = %d\n", lapis[2].id );

    char*       ptr_s = lapis[2].cores; 
    Estrutura*  pE = &lapis[2]; // usando o operador & = 'endereco de'
    printf("\nValor da segunda cor usando o ponteiro para char= %s\n", ptr_s);
    printf("Valor da segunda cor usando o ponteiro para estrutura = %s\n", pE->cores);
    printf("Valor da segunda cor usando a variável = %s\n", lapis[2].cores);

    // mudando o ponteiro para outro lugar
    ptr_s = &  estrutura.cores[0]; 
    printf("\nValor da cor na estrutura usando a variavel = %s\n", estrutura.cores );
    printf("Valor da cor na estrutura usando o ponteiro para char = %s\n", ptr_s);

    return(0);
}

 

Compare e escreva de volta se não entender algo

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!