Ir ao conteúdo
  • Cadastre-se
NerdCaótico

[Linguagem C] Ajuda com alocação dinâmica de char

Recommended Posts

Não consigo imprimir mais de um carácter com char.

"Descrição do Exercício:

Alocação dinâmica de uma estrutura de dados:

Criar um tipo que é uma estrutura que represente uma pessoa, contendo nome, data de

nascimento e CPF. Use a definição das strings como um ponteiro para char.

Criar uma variável que é um ponteiro para esta estrutura (no programa principal)

Criar uma função que recebe este ponteiro e preenche os dados da estrutura. Use o

formato da data como dd/mm/yyyy.

Criar uma função que recebe este ponteiro e imprime os dados da estrutura

Fazer a chamada a estas funções na função principal

Normas para o exercício

Usar alocação dinâmica de memória;

Não restringir o uso de memória;

Testar se foi possível alocação dinâmica;

Desalocar a memória no final;

Lembre-se das passagens de parâmetros para as funções (por valor ou por referência);

Procure usar a declaração da string como um ponteiro para char. "

Meu código:

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char *nome;
int *cpf, *data;
} pessoa;

void pree(pessoa *p,int n)
{ int i;
for (i=0;i<n;i++)
{
printf("digite seu nome \t ");
scanf("%s",&p[i].nome);
printf("\n digite seu CPF \t ");
scanf("%d",&p[i].cpf);
printf("\n digite sua data de nascimento\t ");
scanf("%d",&p[i].data);
}
}

void imp(pessoa *p,int n)
{ int i;
for (i=0;i<n;i++)
{
printf("\n seu nome e: %c ",p[i].nome);
printf("\n seu CPF: %d ",p[i].cpf);
printf("\n sua data de nascimento e: %d \n",p[i].data);

}
}

int main()
{ pessoa *pes;
int n;
printf("escreva a quantidade de pessoas \t");
scanf("%d",&n);
pes=(pessoa*)malloc(n*sizeof(pessoa));
pes->nome=(char*)malloc(sizeof(char));
pes->cpf=(int*)malloc(sizeof(int));
pes->data=(int*)malloc(sizeof(int));


pree(pes,n);
imp(pes,n);


free (pes);

system("PAUSE");
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz aqui um exemplo. Só trabalhar sobre.


#include <stdio.h>
#include <malloc.h>

struct pessoa
{
char
nome[24] ,
cpf[24];
int
dia,
mes,
ano;
};

void add_person(pessoa *&p)
{
printf("digite seu nome\n ");
scanf("%s",p->nome);

printf("digite seu CPF\n ");
scanf("%s",p->cpf);

printf("digite sua data de nascimento\n ");

printf("Dia?\n");
scanf("%d",&p->dia);

printf("Mês?\n");
scanf("%d",&p->mes);

printf("Ano?\n");
scanf("%d",&p->ano);

}
void show_info(pessoa *&p)
{
printf("Nome:%s\n",p->nome);
printf("CPF:%s\n",p->cpf);
printf("Data:%d/%d/%d\n",p->dia,p->mes,p->ano);
}
int main(int argc, char **argv)
{
struct pessoa* p = (struct pessoa*) malloc( sizeof(struct pessoa) );
if(p == NULL) return 0; // não foi possivel alocar memória.

add_person(p);
show_info(p);
free(p);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Siga a sintaxe do código abaixo para saber modificar e imprimir corretamente uma string através de um ponteiro que é parte de um registro, sendo este acessado por um ponteiro para o mesmo, que tem seu conteúdo passado a funções. Como o exercício pede F5Rua4D.gif.


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



struct Tipo
{
char *String;
} Variavel = {"STR 1"};



void Modificar(Tipo *Parametro)
{
strcpy(Parametro->String, "STR 2");
}



void Imprimir(Tipo *Parametro)
{
printf("\"%s\"", Parametro->String);
}



int main(void)
{
Tipo *Ponteiro = &Variavel;
Modificar(Ponteiro);
Imprimir(Ponteiro);
getchar();
return 0;
}

Espero ter ajudado GbhmuXl.gif.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Siga a sintaxe do código abaixo para saber modificar e imprimir corretamente uma string através de um ponteiro que é parte de um registro, sendo este acessado por um ponteiro para o mesmo, que tem seu conteúdo passado a funções. Como o exercício pede F5Rua4D.gif.


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



struct Tipo
{
char *String;
} Variavel = {"STR 1"};



void Modificar(Tipo *Parametro)
{
strcpy(Parametro->String, "STR 2");
}



void Imprimir(Tipo *Parametro)
{
printf("\"%s\"", Parametro->String);
}



int main(void)
{
Tipo *Ponteiro = &Variavel;
Modificar(Ponteiro);
Imprimir(Ponteiro);
getchar();
return 0;
}

Espero ter ajudado GbhmuXl.gif.

Seu exemplo está errado. Ao modificar a "String" seu código vai tentar escrever numa memória inexistente. ou seja, vai dar um segfault.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Seu exemplo está errado. Ao modificar a "String" seu código vai tentar escrever numa memória inexistente. ou seja, vai dar um segfault.

Neste código, por exemplo, há a tentativa de modificar um dado inexistente F5Rua4D.gif:


#include <stdio.h>



int main(void)
{
char *String = NULL;
*String = 10; //Isso tentaria modificar o valor no endereço NULL, que é inválido.
getchar();
return 0;
}

Porém, o mesmo não ocorre no código abaixo, que é como o que postei:


#include <stdio.h>



int main(void)
{
char *String = NULL;
String = "Exemplo"; //Atribuiria ao ponteiro "String" o endereço da string "Exemplo" na memória.
getchar();
return 0;
}

Pois no caso, há uma string "Exemplo" em algum lugar da memória do programa e o ponteiro é ordenado a armazenar o endereço dela, que obviamente é válido.

Espero ter ajudado GbhmuXl.gif.

Compartilhar este post


Link para o post
Compartilhar em outros sites
capturadetelade20130607.png

Não se trata de um erro no código ou relativo à linguagem, mas de uma característica do seu compilador F5Rua4D.gif.

O mesmo coloca a string "STR 1" em uma região de memória somente leitura, e, por isso, impossibilita a atribuição de valores a ela.

@EDIT

Conforme o LNW disse abaixo, a modificação de uma string literal, como na parte do strcpy do meu código, realmente é considerada errada, por ser de comportamento indefinido na documentação da linguagem.

Espero ter ajudado GbhmuXl.gif.

Compartilhar este post


Link para o post
Compartilhar em outros sites

rjjj,

Porém, o mesmo não ocorre no código abaixo, que é como o que postei:


#include <stdio.h>



int main(void)
{
char *String = NULL;
String = "Exemplo"; //Atribuiria ao ponteiro "String" o endereço da string "Exemplo" na memória.
getchar();
return 0;
}

Pois no caso, há uma string "Exemplo" em algum lugar da memória do programa e o ponteiro é ordenado a armazenar o endereço dela, que obviamente é válido.

Este exemplo que você deu difere da questão levantada sobre o seu programa acima. Aqui, exatamente, você tem um ponteiro para um literal em memória. Entretanto, o seu programa acima usa strcpy() para sobrescrever esse literal. E isso não é permitido.

[]'s

LNW

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

×