Ir ao conteúdo

Inserir mais números do que o espaço reservado pelo calloc


Brazuca2013

Posts recomendados

Postado

Olá pessoal, sempre entendi o malloc e o calloc como funções que alocam um espaço na memória. Sei que a principal diferença é que o calloc preenche os espaços com "zero". No entanto, hoje me surgiu uma dúvida nesse programa.


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

int main(){
int *x, *y;

x = (int *) malloc(sizeof(int));
y = (int *) calloc(3,sizeof(int));

*(x) = 50;
*(x+1) = 50;
*(x+2) = 50;
*(x+3) = 50;
*(x+4) = 50;

*(y) = 10000;
*(y+1) = 20000;
*(y+2) = 30000;
*(y+3) = 40000;
*(y+4) = 500000;
*(y+5) = 60000;

return 0;
}

Minha dúvida é: porque tanto x quanto y aceitaram que fossem preenchidos mais valores do que os espaços reservados (3). O malloc eu sei que ele multiplica 3 por 4(bytes) e chega ao valor de 12bytes de espaços reservado, independente da quantidade de números. Mas o calloc eu não sabia que também funcionava assim. É isso mesmo?

Postado
Minha dúvida é: porque tanto x quanto y aceitaram que fossem preenchidos mais valores do que os espaços reservados (3). O malloc eu sei que ele multiplica 3 por 4(bytes) e chega ao valor de 12bytes de espaços reservado, independente da quantidade de números. Mas o calloc eu não sabia que também funcionava assim. É isso mesmo?

Esse tipo de controle fica totalmente a cargo do programador.. em C, você tem bastante liberdade para fazer acessos à memória. O compilador não vai impedir esses acessos indevidos.

Agora você já sabe o porquê do mantra: não use gets() para leitura de strings...

NW

Postado

Acontece que quando você aloca espaço na memória, a função malloc/calloc apenas retorna o endereço da memória do espaço alocado.

Não há verificação se o programa está escrevendo numa região além do espaço alocado, isso é responsabilidade do programador.

Postado

Certo. Então nos dois casos o que é reservado será sempre um tamanho em bytes, independente da quantidade de valores que eu vá reservar. Correto? Quando atingir o tamanho que eu reservei eu não conseguirei armazenar mais valores, independente se foram 3 ou 10 valores.

Postado

1) Certo. Então nos dois casos o que é reservado será sempre um tamanho em bytes, independente da quantidade de valores que eu vá reservar. Correto?

2)Quando atingir o tamanho que eu reservei eu não conseguirei armazenar mais valores, independente se foram 3 ou 10 valores.

1) Sempre é informado o produto do tamanho do tipo (use SIZEOF para isso) pela quantidade de valores que deseja trabalhar, por exemplo;

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

Ai estou alocando 5 * int. Usei sizeof pois o tamanho de int pode variar entre compilares ou sistemas operacionais. No Turbo C, por exemplo, um int ocupa 2 bytes, já para o GCC são 4 bytes. Por isso a quantidade de bytes alocado é irrelevante, você não precisa saber a quantidade de bytes que está sendo alocada, mas apenas a quantidade inteira (5 nesse caso).

2) É importante entender que no processo quem tem que gerenciar o espaço alocado é você. Se o seu programa ultrapassar o tamanho alocado, resultados inesperados podem acontecer. Por isso você deve ter o cuidado de trabalhar apenas no tamanho alocado.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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