Различный вывод кода C - PullRequest
       2

Различный вывод кода C

5 голосов
/ 12 января 2011

Я попробовал код в моей системе.Это то, что я получил ...... 1)

    #include <stdio.h>

    int main()
    {
        //int a = 10;
        printf("%s");
        return 0;
    }

Output:
1í^áäðPTRhh

2)

    #include <stdio.h>

    int main()
    {
        int a = 10;
        printf("%s\n");
        return 0;
    }

Output:
__libc_start_main

Я пробовал в другой системе (diff compiler).И вывод был другим.На самом деле это должна быть печать верхнего значения в стеке.Тогда ты не уникален везде?

Ответы [ 3 ]

9 голосов
/ 12 января 2011

Вы имеете дело с неопределенным поведением , поэтому вы не можете ожидать, что оно будет непротиворечивым и не будет следовать какому-либо шаблону в компиляторах, архитектурах или даже при запуске одной и той же программы.

7 голосов
/ 12 января 2011

В своем выражении printf вы указали спецификатор формата% s, что означает печать строки. Он проверит вершину стека и напечатает строку, находящуюся на вершине стека

Расположение стеков полностью зависит от компилятора

Функция __libc_start_main () должна выполнить любую необходимую инициализацию среды выполнения, вызвать функцию main с соответствующими аргументами и обработать возврат из main (), который был на вершине стека. И это то, что вы получили в качестве вывода

7 голосов
/ 12 января 2011

Поскольку компиляторы могут свободно размещать содержимое стека так, как им нравится. Кроме того, все, что оказывается «на вершине стека», будет printf() интерпретироваться как указатель; в соответствующем месте хранения может быть любой случайный мусор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...