paulo1205
(usa Ubuntu)
Enviado em 15/12/2017 - 01:46h
hugodds97 escreveu:
#include<stdio.h>
#include<stdlib.h>
//PROTOTIPAGEM
void imprime_vetor(int v[], int *n);
void preencher_vetor(int v[], int *n);
int main (void)
{
int *n;
n = malloc(40000000*sizeof(int));
Aqui você aloca um vetor de quarenta milhões de inteiros na memória livre, e se refere a ele através do ponteiro
n (um nome não muito bom, por sinal, porque
n geralmente denota quantidades ou índices; mas não chega a ser um erro).
*n = 10000000; //2000000;
Aqui você grava o valor inteiro equivalente a dez milhões na primeira posição do vetor indicado por
n. Na prática faz o mesmo que “
n[0]=10000000;”.
E aqui você aloca outro vetor, usando o recurso de
array de comprimento variável (ou VLA, do Inglês
variable-length array) do C, com dez milhões de elementos (que é o valor que você gravou em
n[0]). Esse VLA não é alocado na memória livre, mas sim na pilha, e a pilha costuma ter restrições de espaço mais rígidas do que a memória livre.
Tem certeza de que é isso mesmo que você quer? Dois vetores, sendo um (
n) totalmente dinâmico e alocado numa memória mais geralmente mais farta, e outro (
v) alocado de modo automático na pilha, que tem mais restrições?
preencher_vetor(v,n);
imprime_vetor(v,n);
}
void preencher_vetor(int v[], int *n)
É improvável que você queira realmente usar um ponteiro para
n aqui. Seria seguramente mais eficiente passar um inteiro do que um ponteiro para inteiro, uma vez que você está interessado num único valor apontado (e dentro de um laço de repetição, ainda por cima), não no apontamento em si.
E o mesmo comentário vale para a função de impressão, também.
{
int i;
for(i = 0 ; i < *n ; i++) v[i] = i;
}
void imprime_vetor(int v[], int *n)
{
int i;
for(i = 0 ; i < *n ; i++) printf("[%d]",v[i]);
}
Erro "segmentation fault (core dumped)
Certamente você está extrapolando os limites de memória. E eu chutaria que é na hora de alocar o vetor na pilha.