strtol
объявляется в заголовке <stdlib.h>
как
long strtol( const char *restrict str, char **restrict str_end, int base );
// ^^^^^^^^ ^^^^^^^^ since C99
В первом опубликованном фрагменте <stdlib.h>
не включается, и функция вызывается с одним единственным аргументом, так что при компиляциис -Wall -Wextra -std=gnu11
, gcc выдает следующие пояснительные предупреждения перед выводом 0:
prog.c: In function 'main':
prog.c:5:21: warning: implicit declaration of function 'strtol' [-Wimplicit-function-declaration]
printf("%ld\n", strtol("99999999999999999999999"));
^~~~~~
prog.c:5:15: warning: format '%ld' expects argument of type 'long int', but argument 2 has type 'int' [-Wformat=]
printf("%ld\n", strtol("99999999999999999999999"));
~~^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%d
Это означает, что библиотечная функция вообще не вызывается и неявно объявленная функция с тем же именемвызывается, int
со значением 0 возвращается и печатается (с неверным спецификатором формата, который сам по себе является неопределенным поведением).
Обратите внимание, что тот же код не компилируется с clang , который сообщает следующее:
prog.c:4:21: warning: implicitly declaring library function 'strtol' with type 'long (const char *, char **, int)' [-Wimplicit-function-declaration]
printf("%ld\n", strtol("99999999999999999999999"));
^
prog.c:4:21: note: include the header <stdlib.h> or explicitly provide a declaration for 'strtol'
prog.c:4:53: error: too few arguments to function call, expected 3, have 1
printf("%ld\n", strtol("99999999999999999999999"));
~~~~~~ ^
1 warning and 1 error generated.
Во втором фрагменте, strtol
вызывается с правильным количеством аргументов, но, как сообщается (с закомментированным #include
), то же самое отсутствуетпроблема с заголовкомДля получения ожидаемого результата необходимо включить LONG_MAX, заголовок stdlib.h
.