O Ubuntu armazena as variáveis na ordem errada

0

Então eu tive este exercício na minha classe onde eu tive que dizer qual dos dois endereços é maior quando eu crio dois caracteres em uma função principal.

Porque as variáveis locais são armazenadas na pilha que começa com o endereço alto e vai para o endereço baixo. A resposta foi fácil que o primeiro char tem um endereço maior.

Mas então eu escrevi um pequeno programa de testes:

#include "stdio.h"

int main(void)
{
    int a = 3;
    int b = 4;

    printf("Size a: %lu \n"
           "size b: %lu \n",
           sizeof(a),
           sizeof(b));

    printf("Address a: %p \n"
           "Address b: %p \n",
           (void *)&a,
           (void *)&b);

    return 0;
}

Saída:

Size a: 4 
size b: 4 
Address a: 0x7fffa1eb8a98 
Address b: 0x7fffa1eb8a9c 

A saída foi enganosa, o segundo endereço de caracteres foi maior. Eu tentei o mesmo em um computador na minha universidade e lá estava tudo bem. Você sabe por que isso acontece?

Estou no Ubuntu 13.04 64bit.

    
por a2r 30.04.2013 / 12:01

2 respostas

1

O padr C como definido por Kernighan & amp; Ritchie em seu livro "The C Programming Language" não define como os parâmetros são passados às funções, nem define como as variáveis locais são armazenadas, o que deixa a implementação definida.

A documentação do seu compilador deve informar como os parâmetros são passados, caso contrário, você não poderá escrever o código de assembly para vincular-se a ele. Para variáveis locais, há ainda menos restrições, pois elas só serão acessadas de dentro da função, de modo que o compilador pode decidir não armazenar a variável na memória, de modo que ela possa mantê-la em um registrador. Como você pediu o endereço da variável, o compilador foi forçado a armazená-lo na memória, mas, a menos que você use um ponteiro para uma variável específica, não é necessário.

Dois compiladores diferentes podem fazer as coisas de maneira diferente. Muitos compiladores optam por usar a pilha, mas outros usarão os registradores onde isso for possível e, mesmo quando eles usam a pilha, a ordem dos parâmetros está na implementação.

O padrão ANSI C não mudou isso.

Em suma, o Ubuntu não armazena variáveis na ordem errada. O compilador que você usa no Ubuntu apenas os armazena em uma ordem diferente daquela que você usa na universidade. Nem está errado. Eles são apenas diferentes e a documentação do compilador deve explicar como ela é implementada.

Para o gcc, que é o que a maioria das pessoas usa no Linux, a documentação é aqui .

    
por Warren Hill 30.04.2013 / 13:52
2

Eu não acho que entendi porque há um problema, mas acho que o GCC pode ter algo a ver com isso ... Aqui está uma comparação entre o GCC e o Clang.

$ gcc -o test.gcc test.c
$ ./test.gcc
Size a: 4 
size b: 4 
Address a: 0x7fffeef71488 
Address b: 0x7fffeef7148c 


$ clang++ -o test.clang test.c 
$ ./test.clang 
Size a: 4 
size b: 4 
Address a: 0x7fff664573f8 
Address b: 0x7fff664573f4

O compilador e sua versão que você está usando na uni podem ser o elemento variável aqui.

    
por Oli 30.04.2013 / 12:34