2015-11-28 56 views
-4

这个奇怪的输出我与以下c程序的奇怪输出混淆。 我使用TURBOC和DEVC编译C - 为什么在printf()

我将非常高兴,如果有人可以帮助我在这。

计划

#include<stdio.h> 
#include<conio.h> 
int main() 
{ 
    clrscr(); 
    printf("%d","hb"); 

    printf("%d","abcde"-"abcde"); 
    //Output is -6 why ? 

    return 0; 

} 

输出 对于TURBOC

printf("%d","hb"); 
//Output is 173 Why ? 
// No matter what I write in place of "hb" the output is always 173 

printf("%d","abcde"-"abcde"); 
//Output is -6 why ? 

对于开发的C

printf("%d","hb"); 
    //Output is 4210688 Why ? 
    // No matter what I write in place of "hb" the output is always 4210688 


printf("%d","abcde"-"abcde"); 
//Output is 0 why ? 
+0

你应该只写'printf(“hdfetgdffgddb”)'。 – Schizo

+0

您使用了错误的类型转换“%d”而不是“%s”。 %d是整数,%s是字符串 – Zorgatone

+6

未定义行为未定义,集71837469. –

回答

-2

在这里,你正在传递一个字符串(一char*)的内存地址:

printf("%d","hb"); 

然而,应使用的说明符是%p(静置指针):

printf("%p\n", "hb"); // The output is in hexadecimal 

这将确保显示它作为当它被传递给时相同的表示尺寸用于由printfprintf。使用%dint说明符)将导致未定义的行为,当sizeof(int)sizeof(char*)不相同时,即使大小相等,使用%d可能会导致打印负值(如果最高有效位被设置 - 符号位的int)。

对于任何内存地址,你可以不使用不同的工具链时,希望它是相同的程序重新编译后,就更少了。

当输出是改变"hb"字面用另一个之后的相同的,这意味着它是在相同的地址分配。

在这里,两个指针到字符串文字被减去:

printf("%d","abcde"-"abcde"); 

两个指针相减的结果是通过将它们所指向的地址之间的这种类型的元件的数量。 但是请注意,行为仅在指针指向来自同一数组的元素或数组结束后的第一个元素时才定义。

同样,%d未必要使用的正确的说明符。可以使用大小至少等于指针类型的整数类型,可能为long long int(应根据特定平台检查)。减法溢出仍可能发生,或者结果可能不适合投射类型,然后行为再次未定义。

char *p1, *p2; // These should be initialized and NOT point to different arrays 
printf("%lld\n", (long long int)(p1 - p2)); 

还要注意,C标准库提供stddef.h,它定义了用于存储指针差ptrdiff_t类型。看到这一点:C: Which character should be used for ptrdiff_t in printf?

注:由于存在两种不同的char数组,指针减法是不确定的,因此下面的信息只是基于假设,并提出只是因为OP提到,这是一个参加考试。

在我们的例子中,由于sizeof(char)是1,它恰好表示字节的差异。 -6的区别是告诉两个相同的文字"abcde"先放在第二个旁边的内存中。文字包括字符串终止符,所以它的大小是6.

从这里可以推出的另一件事是DevC++使用的编译器是“更聪明”(或有其他优化选项传递给),创建内存中的单个副本为"abcde",因此相差0

字符串文字通常放置在只读内存中,程序不应该尝试修改它,所以如果编译器(或某些情况下的链接器)能够“检测”重复,它可能会重用以前的文字。

+0

非常感谢,你是唯一一个正确回答它的人! – prateek569

+0

@ prateek569不,实际上这是唯一不正确的答案。 –

+0

“但是请注意,只有当指针指向同一个数组中的元素时,或者在数组结束后的第一个元素时才会定义行为。”我不知道你从哪里得到这些信息。我的意思是几乎所有的东西都是错的,但这是对语言本身的基本误解。 – Blindy

相关问题