Jump to content
Sign in to follow this  
Bernardo Vieira

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

Recommended Posts

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 :)

Edited by Bernardo Vieira

Share this post


Link to post
Share on other 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

  • Vote 1

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

Share this post


Link to post
Share on other 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.

Edited by eatg75
  • Vote 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.

Share this post


Link to post
Share on other 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 :)

Share this post


Link to post
Share on other 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).

  • Vote 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.

Share this post


Link to post
Share on other 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.

  • Vote 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."

Share this post


Link to post
Share on other 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 ;)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.