Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.2.184] |
|
Сообщ.
#1
,
|
|
|
в р пусто
sprintf(p, "(%s" , р); в р (( а почему не ( совсем не понял |
Сообщ.
#2
,
|
|
|
Похоже заносит в р сначала (, а потом по формату %s добавляет то, что в р.
В коде (асме) смотреть надо. |
Сообщ.
#3
,
|
|
|
при
sprintf(p, "(%s%s" , p,p); p=((((ю |
Сообщ.
#4
,
|
|
|
Значит так и есть...
При в вызове sprintf в одном регистре (А) запоминается адрес р, в 2 других (Б В) тоже адрес р. Затем обрабатывается вывод по формату "(%s%s", в регистре А адрес смещается на количество символов. Выводится то, что по адресу р. И вообще функция printf древняя и не интелектуальная, с ней помню были часто проблемы |
Сообщ.
#5
,
|
|
|
Цитата maxutov @ Потому чтоа почему не ( Цитата 7.19.6.6 The sprintf function #include <stdio.h> int sprintf(char * restrict s, const char * restrict format, ...); The sprintf function is equivalent to fprintf, except that the output is written into an array (specified by the argument s) rather than to a stream. A null character is written at the end of the characters written; it is not counted as part of the returned value. If copying takes place between objects that overlap, the behavior is undefined. Добавлено Это из C99. Если взять более распространённый C90, то там то же самое, только номер пункта 4.9.6.5 и без restrict. |
Сообщ.
#6
,
|
|
|
и ни один компилятор не скажет
что ub? |
Сообщ.
#7
,
|
|
|
А как он об этом узнает?
|
Сообщ.
#8
,
|
|
|
ну данную
ситуацию можно проанализировать |
Сообщ.
#9
,
|
|
|
Ну на, анализируй:
void coolFunc(char*, const char*, size_t ...); |