2016-06-24 94 views
-5

我知道unsigned int *和int *不兼容。但是因为i,j是int *(int指针),那么它们如何使用无符号类型进行打印。为什么它会输出0!为什么输出是这样的?

#include<stdio.h> 
//#include<conio.h> 
main() 
{ 
    int *i,*j,**k; 
    //i+2; 
    k=&i; 
    printf("\n*k=%u j=%u i=%u",*k,j,i); 
    //getch(); 
} 

输出:

*k=0 j=0 i=0 

它的295℃的问题,其中一个问题,我只是想了解是什么在此代码发生的事情!我没有写这个代码!

+1

用于使用具有自动存储持续时间的对象的值,而它没有被初始化未定义行为,未定义的行为:

此外应使用%P

int main() { int *i,*j,**k; // Initialize i, j and k int x = 42; i = &x; j = &x; k=&i; // Use i, j and k printf("\n*k=%p j=%p i=%p",(void*)*k, (void*)j, (void*)i); return 0; } 

实施例输出打印指针值将错误的类型传递给'printf()'。 – EOF

+0

这里真正的问题是'i'和'j'都没有被定义,因此也不是'* k'。你所做的只是打印未定义的值。至于格式,你是对的,'%u'应该传递'unsigned int'。 –

+0

使用正确的格式说明符来打印指针..阅读此链接。可能对你有用..http://stackoverflow.com/questions/9053658/correct-format-specifier-to-print-pointer-address – sas

回答

2

正如注释中所述,您在使用未初始化的变量时存在未定义的行为,因此可能会打印任何内容(或程序可能会崩溃)。

所以确保在使用它们之前初始化变量。

*k=0xbfd9eb8c j=0xbfd9eb8c i=0xbfd9eb8c 
+0

亚我明白这一点,谢谢! – winter

1

这没有任何意义。你声明但不是初始化未定义行为的变量。

最重要的是,您使用错误的格式说明符来打印它们,这也是未定义的行为。

为什么输出是这样的?

因为您滥用该语言,并因此而导致任何事情发生。它可能会因段错误而崩溃。它可以打印不同的垃圾值。它的全部未定义。

+0

我没有写代码,它是295 C的问题之一的问题。只是想理智! – winter