Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Bernardo Vieira

Alocação dinámica de memória dentro de struct

Mensagens Recomendadas

Bernardo Vieira

Olá a todos,

Bem, em mais um dos meus testes, eu fiz uma coisa que me deixou com algumas duvidas!

primeiro eu fiz isso:

http://pastebin.com/M7kF2JYr

mas como eu precisava usar dentro de uma struct tive que fazer alterações e apareceram algumas duvidas

nesse codigo abaixo, eu iniciei pessoa[1].chave com 2 valores, no entanto eu coloco valores em 5, como em pessoa[0].chave, mas isso nao gera nenhum erro, nem warning, compila e funciona corretamente, mas fica-me a duvida! é correto fazer isso? ou existe outra forma mais correta?

#include <iostream>

struct pes {
int *chave;
};

pes pessoa[2];

int main() {

pessoa[0].chave = new int[5];
pessoa[1].chave = new int[2];

pessoa[0].chave[0] = 5;
pessoa[0].chave[1] = 15;
pessoa[0].chave[2] = 25;
pessoa[0].chave[3] = 35;
pessoa[0].chave[4] = 45;

for(int i=0; i!= sizeof(pessoa[0].chave); i++) {
std::cout << pessoa[0].chave[i] << std::endl;
}

std::cout << "\n";

pessoa[1].chave[0] = 22423424;
pessoa[1].chave[1] = 1453632;
pessoa[1].chave[2] = 2245222;
pessoa[1].chave[3] = 5253232;
pessoa[1].chave[4] = 42342422;

for(int i=0; i!= sizeof(pessoa[1].chave); i++) {
std::cout << pessoa[1].chave[i] << std::endl;
}

std::cout << "\n";

for(int i=0; i!= sizeof(pessoa[0].chave); i++) {
std::cout << pessoa[0].chave[i] << std::endl;
}

std::cout << "\n";

system("pause");
return 1;
}

PS. para usar como no priemro codigo eu teria de ser

struct pes {
int chave[];
} pessoa;

porque se eu quisesse mais que uma pessoa, como no exemplo 2 "pessoa[2];" já dava erro porque o valor da array estava vazio!

Desde já obrigado :)

Editado por Bernardo Vieira

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

obviamente que não é correcto

não te dá erro porque a tua aplicação é tão simples que a memória que estás a utilizar (que não faz parte da alocada) não é utilizada

pura e simples sorte

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
eatg75

Como o HappyHippyHippo disse este tipo de listagens de codigo esta errado, pois acedes

a enderecos de memoria os quais nao pretendias aceder e alteras conteudo de enderecos

de memoria os quais nao pretendias alterar.

Para alem disso acho que tens 1 erro repitido em 2 sitios

for(int i = 0; i != sizeof(pessoa[0].chave); i++) { // nesta linha suponho que querias obter o tamanho do array
					    // e a forma correta seria algo como sizeof(pessoa[0].chave) / sizeof(int)

 std::cout << pessoa[0].chave[i] << std::endl;
}

E porque nao utilizas o std::size_t para os indices e tamanhos de array? Ela e definida no ficheiro

header cstddeff assim o teu codigo fica mais ligivel e as comparacoes far-se-ao entre variaveis

do mesmo tipo.

@HappyHippyHippo ele utiliza memoria dinamica, porque ele utiliza o new, e este utiliza o

malloc() da biblioteca do C na plataforma em que o codigo e corrido.

Editado por eatg75
  • Voto 1

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Bernardo Vieira

obviamente que não é correcto

não te dá erro porque a tua aplicação é tão simples que a memória que estás a utilizar (que não faz parte da alocada) não é utilizada

pura e simples sorte

pura sorte mesmo, é que so lê os primeiros 3 valores da array, mesmo que tenha 10! :|

Como o HappyHippyHippo disse este tipo de listagens de codigo esta errado, pois acedes

a enderecos de memoria os quais nao pretendias aceder e alteras conteudo de enderecos

de memoria os quais nao pretendias alterar.

Para alem disso acho que tens 1 erro repitido em 2 sitios

for(int i = 0; i != sizeof(pessoa[0].chave); i++) { // nesta linha suponho que querias obter o tamanho do array
						// e a forma correta seria algo como sizeof(pessoa[0].chave) / sizeof(int)

 std::cout << pessoa[0].chave[i] << std::endl;
}

E porque nao utilizas o std::size_t para os indices e tamanhos de array? Ela e definida no ficheiro

header cstddeff assim o teu codigo fica mais ligivel e as comparacoes far-se-ao entre variaveis

do mesmo tipo.

@HappyHippyHippo ele utiliza memoria dinamica, porque ele utiliza o new, e este utiliza o

malloc() da biblioteca do C na plataforma em que o codigo e corrido.

sizeof(pessoa[0].chave) / sizeof(int)

se eu fizer isso só le o primeiro valor da array!

bem, foi procurar sobre, como fazer com std::size_t consegui um bom resultado, até porque quando tento adicionar mais um valor o programa deixa de funcionar

acho que já tirei as minha duvidas! Obrigado aos dois :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
eatg75

Fui compilar um bocado de codigo com um compilador de C++ para testar o diseste e de facto

tens razao, o numero de elementos calculado e incorrecto quando a bloco de memoria e alocado

da Heap mas se a memoria for alocada na Stack o tamanho correcto do array e devolvido, isto e

uma comportamento estranho e nao percebo do mesmo. Reparei que sempre tento calcular o

tamanho de um array alocado dinamicamente o sizeof apenas devolve os 2 primeiros bytes do

bloco de memoria.

Eu sugeri a utilizacao do size_t porque como sabemos em C/C++ os indices dos elementos num

array nao podem ser negativos, e o size_t e um typedef unsigned int size_t, e em comparacoes

como: if (current_index < (sizeof(array) / sizeof(int))) evitaras comparacao de dois

tipos de dados distintos (o que geraria um aviso pelo compilador).

  • Voto 1

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

o sizeof(array)/sizeof(int) so' funciona para arrays alocados na stack, elementos alocados na heap isto nao funciona, necessitas de uma variavel de apoio, que te diga o numero de elementos existentes.

  • Voto 1

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Bernardo Vieira

pois...

estou a entender!

@eatg75

sim, eu ja fiz com size_t, consegui melhores resultados, até porque se a array for de 11 valores eu nao consigo defenir 12 valores, e como eu tenho no primeiro exemplo consigo!

Mais uma vez obrigado a todos ;)

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.