Ir ao conteúdo
  • Cadastre-se
SecretFox

Programa parando de funcionar

Recommended Posts

Olá, sou novo no fórum e queria começar já tirando uma dúvida...

Eu fiz um programa e ele compilou normal, mas aparentemente ele trava quando tá rodando. Com certeza tem algo errado e gostaria que vocês pudessem me dizer o que é.

Aqui tá o código numa versão resumida (o original era mais extenso e está em outro computador, mas a ideia é a mesma):

 

#include <stdio.h>

char func (void) {
    char vet[20];
    int count;
    for (count = 0 ; vet[count] != 0 ; count++) {
        vet[count] = 'T';
    }
    vet[count] = 0;
    return vet;
}

int main () {
    char *pt;
    pt = func();
    puts(pt);
}
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@SecretFox Você quer pegar o endereço de uma variável local? eu acho meio difícil, até onde eu saiba, as variáveis locais são desalocadas no termino do bloco. o melhor que você faz é passar um ponteiro de char como parâmetro da função, e dentro da função você aloca dinamicamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas se você fizer assim, por exemplo: 

 

#include <stdio.h>

int retorna () {
    int  v[4], i;
    for (i = 0; i < 4 ; i++) {
        v = 2;
    }
    return v;
}

int main(){
    int *pt;
    pt = retorna();
    printf("%d %d %d %d", pt, pt[1], pt[2], pt[3]);
}
 

 

Ele pega normalmente o endereço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

uma variavel normal só tem validade durante a vida de uma função, quando você invocar uma função, só então nessa hora serão criados o conjunto de variáveis que foram declarados dentro da função em questão la na memoria RAM, porém quando a função terminar, essa memoria será liberada, se você receber(no caso que fosse possível) o ponteiro dessa memoria, saiba que outro programa pode tomar o controle desse espaço, e por valores não desejados, para fazer o que você quer o correto é usar a freestorage, ou seja, alocação dinâmica de memoria (malloc, free, etc), as variáveis declaradas com malloc só serão liberadas com free, incluso si esquecer de liberar essa memoria ela continuará aí até apagar o computador. A solução que você está buscando é essa:
 

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

int* retorna () {
    int*  v, i;
    v = (int*) malloc( sizeof(int)*4 );
    
    
    for ( i = 0; i < 4 ; i++ ) {
        v[i] = 2;
    }
    
    return v;
}
int main() {
    int *pt;
    pt = retorna();
    printf ( "%d %d %d %d", pt[0], pt[1], pt[2], pt[3] );
    
    free(pt);
    return 0;
}

O que você ta tentando fazer, hipoteticamente falando, si fosse possível e o compilador não mostrasse erros, esta errado essa lógica.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@vangodp Valeu cara. Eu tava estudando ponteiros, mas ainda não cheguei na parte de alocação dinâmica, vou avançar no estudo então. Obrigado mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 horas atrás, SecretFox disse:

@vangodp Valeu cara. Eu tava estudando ponteiros, mas ainda não cheguei na parte de alocação dinâmica, vou avançar no estudo então. Obrigado mesmo.

@SecretFox Não faça isso, entenda bem primeiro aos ponteiros para depois passar ao seguinte nivel, um dos conselhos que dou e que ninguém segue é nunca avançar si nao entendeu o anterior, só vai dar lugar a um conhecimento pobre e deficiente, ainda mais os tais ponteiros. >_< Ponteiros é um dos mais importantes poderosos recursos na linguagem C/C++.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, não, quando eu falei que tava estudando ponteiros eu quis dizer que já tinha terminado, kkk, deu pra entender bem, na verdade, quando eu fiz o tópico eu tava vendo strings. Agora to em alocação dinâmica. Valeu aí.

  • Curtir 1

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

×