2016-12-14 26 views
-2
#include <stdio.h> 

void f(char**); 

int main() { 
    char *argv[] = { "ab", "cd", "ef", "gh", "ij", "kl" }; 

    f(argv); 
    return 0; 
} 



void f(char **p) { 
    char *t; 

    t = (p += sizeof(int))[-1]; 
    printf("%s\n", t); 
} 

这是我有的代码,问题是要求输出。我想知道为什么输出是gh。我认为sizeof(int)将等于char中的元素数量,以“t”语句为单位,它会使得它为6,然后减1。然后我打印sizeof(int),它给了我4.我只是困惑为什么sizeof(int)是4而不是6. 在此先感谢。为什么这个代码的输出是gh?

+3

'sizeof(int)将等于char中元素的个数'你怎么可能得出这个结论? – John3136

+0

嘿,猜猜是什么'argc'! – paddy

+0

我的意思是说,如果它只是一个字符串说“字符串”它将是该字符串的字节大小?然后我进一步寻找和纠正我,如果我错了,但它会是4,因为它计算指向字符的大小,这将是4字节? – thrugs

回答

1

t = (p += sizeof(int))[-1];说明:

  1. p这是一个指针由sizeof(int)元素递增。在您的机器上,sizeof(int)似乎是4
  2. p是指向第五个元素的指针,它是"ij"
  3. [-1]指定p减一个元素为tp减1表示您指向指向"gh"的指针。噢,由于方括号的存在,这里有一个取消引用操作。
  4. print t

只是为了说明第三点,你可以通过下面的代码替换f和检查:

void f(char **p) { 
    char **t; 

    t = (p += sizeof(int)) - 1; 
    printf("%s\n", *t); 
} 

HTH。

+1

我不确定我喜欢“'[-1]'将'p'减少一个元素赋值为't'我认为你得到的是根据标准,”E1 [E2] (*((E1)+(E2)))。“(ISO/IEC 9899:2011 6.5.2.1/2)因此,'p [-1] ==(*(p - 1) )',这很好,只要'p'不指向数组的第一个元素,所以't'实际上被分配了'p'前面的指针所引用的值。 –

+0

@DavidBowling“'t '实际上被分配了'p'前面的指针所引用的值 - 精彩地放入。:) – babon

0

我只是困惑,为什么的sizeof(int)的是4,而不是6

其他人已经给你正确的答案,所以我只是想帮你弥合差距你对sizeof(int)的假设。

sizeof是一个C操作符(不是函数)。如果您有Linux或Mac可用,终端中的人操作员将向您显示整个列表。它产生操作数的大小,以字节为单位。与大多数操作员不同,sizeof操作变量。当您说sizeof(int)时,您将sizeof应用于数据类型int。不出所料,结果总是相同的,因为在C中,每个程序中的每个int具有相同的大小。在你的机器上,这个尺寸是4.

进一步,你可以看到给一个变量的名字sizeof只是一个方便。编译器解析名称,找到其类型,并获取该类型的大小。

的char * argv的[]

我们可以应用的sizeof您argv有效找出多少元素在数组中。整个阵列的大小(以字节为单位)为sizeof(argv)。每个元素(因为数组中的所有元素都具有相同的大小)的大小(以字节为单位)为sizeof(argv[0])。那么元素的数量是sizeof(argv)/sizeof(argv[0])。你甚至可以说,

enum { nargv = sizeof(argv)/sizeof(argv[0]) }; 

因为所有的信息在编译时可用。

相关问题