700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > c语言printf %llo c++ - Printf疯狂了 - 堆栈内存溢出

c语言printf %llo c++ - Printf疯狂了 - 堆栈内存溢出

时间:2021-03-13 13:58:25

相关推荐

c语言printf %llo c++ - Printf疯狂了 - 堆栈内存溢出

你不能使用%d来打印long long 。 你必须使用%lld 。 (因此请使用"\\n%d %d | %lld %lld | %d %d"作为格式字符串。)

特别是,显而易见的是,在“52 0 | 52 0”中,第一个52 0是a.rez ,第二个52 0是b.rez (这些中的每一个都是long long ,显然是(从输出)将两个单词推入堆栈)。 a.tonum不打印a.tonum和b.tonum 。

要理解为什么会发生这种情况,让我解释一下乔纳森和我想说的话。 当你调用像一个可变参数函数printf (被声明为类似printf(const char *format, ...)编译器没有办法来验证正确的参数类型的...在编译时。因此,有在这种情况下决定在堆栈上推送什么的过程,大致可以概括为:如果它是int或可升级到int ,它将被推送为int ;如果它是double或可升级为double ,则它被推送为double ;否则,按原样推送。

在实现像printf这样的可变函数时,您需要一些方法来访问...项目。 这样做的方法是使用在声明的va_list 。 这是一些伪代码,显示它是如何使用的:

int printf(const char *format, ...)

{

va_list ap;

va_start(ap, format);

while (/* we find the next format marker */) {

if (/* %d, %i, %c */) {

int val = va_arg(ap, int);

/* print out val as decimal or (for %c) char */

} else if (/* %u, %x, %X, %o */) {

unsigned int val = va_arg(ap, unsigned int);

/* print out val as decimal, hex, or octal */

} else if (/* %ld, %li */) {

long val = va_arg(ap, long);

/* print out val as decimal */

} else if (/* %lu, %lx, %lX, %lo */) {

unsigned long val = va_arg(ap, unsigned long);

/* print out val as decimal, hex, or octal */

} else if (/* %lld, %lli */) {

long long val = va_arg(ap, long long);

/* print out val as decimal */

} else if (/* %llu, %llx, %llX, %llo */) {

unsigned long long val = va_arg(ap, unsigned long long);

/* print out val as decimal, hex, or octal */

} else if (/* %s */) {

const char *val = va_arg(ap, const char *);

/* print out val as null-terminated string */

} /* other types */

}

va_end(ap);

return /* ... */;

}

请注意,每次要选择...参数时,都要使用va_arg ,并且必须指定要选择的类型。 您可以选择正确的类型。 如果类型不正确,则会出现类型错误,在大多数情况下会出现未定义的行为(意味着程序可以执行任何喜欢的操作,包括崩溃或更糟)。

在您的特定计算机中,似乎当您通过long long ,它将64位数量推送到堆栈,但因为您使用了%d格式说明符,它使用了va_arg(ap, int)版本,它只抓取一个32位的数量。 这意味着64位字的另一半仍然未读,后续%d然后继续读取。 这就是为什么在格式字符串完成时,它永远不会处理你传递的a.tonum和b.tonum的值。

如果您正确使用%lld ,它将使用va_arg(ap, long long) ,并且可以正确读取整个64位数量。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。