为什么当我尝试打印argv
的值时(根据Eclipse根据以下程序的特定运行0x7fffffffd958
),我得到ffffd958
而不是7fffffffd958
int main (int argc, char *argv[]) {
printf("%x \n", argv);
return 0;
}
?
mask = tf.diag(tf.ones([n]))
y = tf.mul(mask,y)
cost = -tf.reduce_sum(y)
答案 0 :(得分:2)
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("%p\n", (void*)argv);
return 0;
}
这将处理指针类型的大小,而不是unsigned int
的大小,它可能不相同。格式%p
需要void*
参数。
答案 1 :(得分:1)
长话短说:由于格式说明符错误,您正在调用未定义的行为。改为使用:
printf("%p \n", (void *) argv);
您获得不同值的原因是%x
将argv
视为您平台上的32位无符号整数。您可能可能使用%lx
(或可能%llx
),但由于argv
属于指针类型,因此仍然是错误且不正确的做法。
答案 2 :(得分:1)
使用%p
打印void *
是正确的,但%p
的输出是实现定义的(所以它已记录在案),并且它在不同平台之间有所不同。特别是,某些平台会输出前导0x
,有些则不会。我认为他们都使用十六进制,但即使这不是强制性的(printf()
):
p
参数应该是指向void
的指针。指针的值是 转换为一系列打印字符,在实现定义中 方式。
另一种方法是使用<inttypes.h>
中的C99设施:
printf("0x%08" PRIXPTR "\n", (uintptr_t)argv);
从技术上讲,uintptr_t
是一种可选类型。在实践中,我不知道它不可用的系统(但是如果有例外,一些大型机或类似的计算机可能是候选者)。这允许您控制格式 - 我喜欢大写十六进制除了领先的0xFEDCBA987654321
,因为它是均匀的高度,而0xfedcba9876543210
有a
,c
的下降和e
。 YMMV!