Ir ao conteúdo
  • Cadastre-se
Poisoned00

C Criar lista de nomes usando apenas ponteiros

Recommended Posts

Eai galera , estou implementando uma vetor de string simples , a ideia é apenas inserir nomes , e após inserir os nomes imprimi-los. Porém só posso usar ponteiros.

 

Estou tendo uma certa dificuldade com isso .. e até o momento consegui fazer o código inserir 1 nome, quando ele vai pro próximo nome da APPCRASH , o windows força o encerramento da aplicação..

 

Help please.

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

int main(int argc, char const *argv[])
{
	char *usuarios[20];
	char *aux;
	int *i;

	aux = (char*)malloc(20*sizeof(char*));
	i = (int*)malloc(sizeof(int*));
	*i = 0;
	
	
	for(;;){
		
		printf("Entre com um nome:");
		fgets(aux,20,stdin);
		
		usuarios[*i] =  malloc ((strlen(aux))*sizeof(char));
		
		strcpy(usuarios[*i],aux);
		
		if((strcmp(usuarios[*i],"\n"))==0){
			break;
		}


		printf("Adcionado > %sNa pos > %d\n",usuarios[*i],*i);
		i++;

	}

	return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Poisoned00 Olá. Vou procurar passar um código mais simples para você entender melhor sobre alocação de memória para o caso de vetor de strings:

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

int main(int argc, char *argv[])
{
    char **nomes = NULL;
    int i;

    nomes = malloc(5 * sizeof(char *)); // memória alocada para 5 nomes, mas...

    for (i = 0; i < 5; i++) {
        nomes[i] = malloc(20 * sizeof(char)); // ...cada nome ocupa 20 caracteres
    }

    for(i = 0; i < 5; i++) {

        printf("Entre com um nome: ");
        fgets(nomes[i], 20, stdin);

        printf("Adcionado > %sNa pos > %d\n", nomes[i], i);
    }

    for (i = 0; i < 5; i++) {
        free(nomes[i]); // libera primeiro as colunas
    }

    free(nomes);

    nomes = NULL;

    return 0;
}

Vê se consegue entender bem a lógica do q está no código

Se tiver dúvidas fique a vontade para perguntar

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

nossa eu sou muito burro ! OIJAWEOIJAWIOE eu sabia que matriz usava ponteiros de ponteiros , mas eu não liguei ao fato de que vetores de strings  acabam sendo eram matrizes também ! 

Cara obrigadão ! vai me ajudar muito , eu to fazendo uma disciplina na faculdade de BCC chamada algoritimos e estrutura de dados e to vendo ponteiros pra tudo quanto é lado kkkkk 

Ok , uma pergunta : no trecho em que você faz a alocação dinâmica , primeiro , você não utiliza typecasting  ( em nenhuma das duas alocações ) .
Eu aprendi que pra fazer uma alocação a função malloc considera todos as variáveis como ponteiros do tipo  void , então é necessário fazer o typecasting , é correto isso ?é realmente necessário ? eu já vi diversos códigos que não o fazem..
Exemplo o meu código ta com typecasting na frente : (char*)malloc(20*sizeof(char*))
no inicio da alocação eu informo que o ponteiro é do tipo (char*).
o seu não : malloc(5 * sizeof(char *)) .

outra pergunta : no primeiro você usou sizeof(char*) , no segundo usou sizeof(char).
A pergunta é  : é um ponteiro de ponteiros ( char**) , portanto  , no caso eu não deveria alocar espaços de memórias primeiramente para ponteiro de ponteiros ? tipo sizeof(char**) 
 e em seguida alocar memória para o ponteiro sizeof(char*) ?
essa dúvida vem do fato de que já que vamos alocar memória para essa variável , e a variável é x , então ao meu ver deveria ser alocada memória para o espaço x . entende ?

desculpa pela bíblia , mas eu to bem enrolado com estrutura de dados.. kkkkkk 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Poisoned00 Olá. Na verdade não é preciso fazer o casting (ou typecasting ) para o retorno da função malloc

Além de desnecessário, pode te induzir ao erro. O que ocorre é uma conversão implícita para o tipo do ponteiro

Se eu faço isso:

int *p = malloc(5 * sizeof(int));

Já ocorre uma conversão implícita do retorno da função malloc para o tipo do ponteiro, que seria int *

Como já disse, além de desnecessário pode te induzir ao erro!

 

Já quanto a segunda pergunta, recomendo fortemente dar uma olhada nesse tutorial:

Cap 08 - Matrizes.pdf

Texto retirado do tutorial: Primeiro, temos que alocar o vetor de
ponteiros. Em seguida, alocamos cada uma das linhas da matriz, atribuindo seus endereços
aos elementos do vetor de ponteiros criado

Ps: Só que nesse tutorial, como em muitos que se encontram por aí, é usado o casting (typecasting) para a função malloc. Já foi falado sobre isso acima

 

Obs: Se alguém tiver uma explicação mais adequada para dar ao @Poisoned00 com respeito a segunda pergunta fique a vontade para postar.

Devo dizer q tentei dar uma explicação e, apesar de já ter criado um texto enorme, resolvi não postar.

Já percebi que essa dificuldade em dar uma explicação de algo que entendo facilmente se deve ao fato de pouco conhecimento técnico com respeito a linguagem e vou procurar corrigir isso :blush:

 

**** Inclusive lembrei do que acontecia com meu instrutor dos cursos de Java na época q ele trabalhava na IBM.

Ele conta que participava da equipe responsável em entrevistar e contratar novos funcionários para a empresa em questão, e, inicialmente, eram feitas algumas perguntas com respeito a linguagem (no caso Java) e até aí tudo bem, mas quando chegava a parte de fazer perguntas técnicas com respeito ao Java para os candidatos, ninguém se dava bem e ele conta de como era difícil achar alguém realmente qualificado para o emprego :wacko:

 

Caso inda tiver dúvidas fique a vontade para perguntar, ok?

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

char **nomes é um ponteiro que aponta para um ponteiro, ou seja é um 'ponteiro para ponteiro'. O malloc irá então alocar memória para ponteiros normais char * , os quais poderão ser apontados por este ponteiro para ponteiro.

 

Então no caso de malloc(5 * sizeof(char *)) está sendo alocado o espaço de memória suficiente para conter 5 ponteiros normais do tipo char.

 

E ao fazer a atribuição do retorno desse malloc ao ponteiro para ponteiro nomes, ele apontará para o primeiro desses cinco ponteiros alocados, o que significa que podemos usar aritmética de ponteiros, como *(nomes + 1) ou nomes[1], para acessar cada um dos ponteiros alocados pelo malloc.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara valeu pela força ! eu achei massa tu ter falado sobre o trabalho com JAVA , a minha intenção é trabalhar como programador nessa linguagem depois da faculdade. 
E eu sempre fico me perguntando em como é o dia a dia nessa linguagem , e como são os trabalhos desenvolvidos , ou o que tem mais se desenvolvido com java no mercado de trabalho por ai..
Queria ter uma direção pra o que estudar sobre java , no meu curso a gente estuda a linguagem em uma disciplina de programação orientada a objetos , mas acho que depois é só C ou python , ah e VDHL na parte de eletrônica..
 

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×