Ir ao conteúdo

Posts recomendados

Postado

Estou com duvida sobre como os ponteiros vão funcionar na stack, quando eu defino um ponteiro para uma variavel char, essa variavel char vai ser empilhada na stack e não na heap, porém para pegar a variavel de volta é preciso desempilhar a stack ou isso não é necessario? A máquina consegue consultar um valor na stack sem desempilhar?

Postado

@XPointersX Como te disse, não existem "ponteiros para stack". 

 

Já foi diferente, mas hoje em dia o normal é ter ponteiros como variáveis de 4 ou 8 bytes com algum valor que supostamente é um endereço para uma variável do tipo do ponteiro. Só isso.

 

40 minutos atrás, XPointersX disse:

quando eu defino um ponteiro para uma variavel char, essa variavel char vai ser empilhada na stack e não na heap, porém para pegar a variavel de volta é preciso desempilhar a stack ou isso não é necessario? A máquina consegue consultar um valor na stack sem desempilhar?

 

Não funciona assim. Mesmo o ponteiro pode estar ou não no stack. E a manipulação disso é transparente. Pela definição de pilha você sempre pode consultar um valor no stack: só um. O de cima. Essa é a noção de stack.

 

Assim é ao chamar uma função: empilha os argumentos e o endereço de retorno. A função recebe os argumentos, executa o código e retorna para o tal endereço

 

  • Curtir 1
Postado

Então se eu defino uma variavel "char" dentro da função main e depois entro dentro de outra função dentro da main, meu stack frame vai ser diferente e meu topo de pilha também, se dentro da nova função eu precisar resgatar o valor de char, como a máquina vai fazer isso?

Postado

Se a variavel for usada pela função, a máquina passa ela como argumento automaticamente? mesmo eu não passando no codigo?

Postado

@XPointersX não, não passa. Não faria sentido.

 

Rode esse programa

 

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

int f(int*);

int main(void)
{
    int         num = 42;
    int*        pNum = &num; // pNum aponta para algo no stack
    f(pNum);
    pNum  = (int*)malloc(sizeof(int));
    *pNum            = 17;
    f(pNum);
    // agora aponta para algo no heap
    free(pNum); // agora e invalido mas ainda aponta para la
    pNum = NULL; // agora ok
    return 0;
}

int f(int* p)
{
    printf("\tf() endereco %p valor %d\n", p, *p);
    return 12;
}

 

E talvez ajude a entender a saida

 

        f() endereco 000000E9C597F744 valor 42
        f() endereco 0000025B534A5A30 valor 17

 

  • Curtir 1
Postado

Ainda não está claro como o programa acessa uma variavel que não está no topo da stack sem desempilhar a stack.

Postado

@XPointersX ? o programa não faz isso. Ou o stack teria outro nome 😉 Todo o valor de uma função é NÃO fazer isso. É criar um ambiente de execução separado e que pode ser chamado milhões de vezes com valores locais.

 

Entendeu o programa como te mostrei? 

 

Sobre a pergunta: "Como funcionam ponteiros para stack" : não existem ponteiros para stack, como eu disse 3x existem ponteiros, que podem ou não estar apontando para algo válido. E se for algo válido pode estar no stack ou não. Tanto faz.

  • Curtir 1
Postado

@arfneto Não estou falando sobre ponteiro, mas como o programa vai acessar um valor que não está no topo da stack sem desempilhar. você sabe como isso é feito? Porque não faz sentido o programa desempilhar tudo apenas para pegar o valor da variavel que não está no stack frame da função.

Postado

@XPointersX

13 minutos atrás, XPointersX disse:

Não estou falando sobre ponteiro, mas como o programa vai acessar um valor que não está no topo da stack sem desempilhar. você sabe como isso é feito? Porque não faz sentido o programa desempilhar tudo apenas para pegar o valor da variavel que não está no stack frame da função

 

Então você postou uma questão com o título "Como funcionam ponteiros para o stack"  mas não está falando sobre ponteiro?

 

15 minutos atrás, XPointersX disse:

como o programa vai acessar um valor que não está no topo da stack sem desempilhar

 

Não vai. Por isso se chama stack (pilha). Entendeu o programa que te mostrei? Rodou em sua maquina? Entendeu que f() pega o ponteiro do stack? 

 

16 minutos atrás, XPointersX disse:

Porque não faz sentido o programa desempilhar tudo apenas para pegar o valor da variavel que não está no stack frame da função.

 

O que é "tudo"?  Faz todo o sentido. No caso do exemplo pega o argumento e o endereço de retorno, roda a função e usa o endereço de retorno para.... retornar.

  • Curtir 1
Postado

@arfneto Um exemplo, o programa entra na função main, nela é declarada a variavel char, a função main tem outra função(na qual não tem a declaração da variavel char) Quando a função estiver na stack, o valor de char não vai estar no topo da stack, ou seja vai estar muito antes do stack frame da função. Como a máquina vai pegar o valor de char se char está muito antes na stack e não está no topo sem desempilhar a stack? Ou a máquina vai desempilhar a stack inteira até chegar em char para pegar o valor e retornar para  a função. Esse é o meu questionamento.

Postado

@XPointersX Acho que não entendeu o exemplo que e mostrei.

 

Funções não ficam "no stack". E não tem acesso a acessas variáveis de que está falando. Esse é todo o propósito de funções: segmentos isolados de código e variáveis. Ambientes de execução. E se procura usar ambientes cada vez menores e mais isolados e não o contrário. Seria um desastre se as funções tivessem uma maneira de mexer "no meio da stack" como citou. E claro que o nome ia ser outro, como eu disse aqui outras vezes. Um programa de 200.000 mil não é raro hoje em dia. Se corromper uma variável como vai achar onde foi se tudo for acessível? Por esse mesmo motivo variáveis globais são proibidas em toda parte, escolas e empresas. Entenda que fora de main() está o escopo global e tudo declarado lá é então global e por isso em geral NADA se declara lá.

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!