为什么这段代码的输出是什么?

时间:2016-12-14 03:32:52

标签: c

#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。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

p的解释:

  1. sizeof(int)这是一个指针,由sizeof(int)元素递增。在您的计算机上,4似乎是p
  2. "ij"是指向第五个元素的指针,即[-1]
  3. pt分配给p一个元素。 {1}递减1表示您指向"gh"的指针。哦,由于方括号,这里有一个解除引用操作。
  4. 打印t
  5. 为了说明第三点,您可以使用以下行替换f并检查:

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

    HTH。

答案 1 :(得分:0)

  

我很困惑为什么sizeof(int)是4而不是6

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

sizeof 是C运算符(不是函数)。如果您有可用的Linux或Mac,终端中的 man operator 将显示整个列表。它产生操作数的大小,以字节为单位。与大多数运算符不同,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]) };

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