繁体   English   中英

结构指针-使用指针访问结构数组

[英]Structure Pointers - Accessing array of structure using pointers

我有这个简单的程序:

#include <stdio.h>

struct time
{
    int hours ;
    int minutes ;
    int seconds ;
} t[2] = {1,2,3,4,5,6};

int main() {    
    struct time *tt = t;
    printf("%d\n", (*tt));
    printf("%d", *(tt+1));
}

现在预期的输出应该是:

1
4

但是我得到的输出是2个完全相同的内存地址。 我将此程序发送给其他人,有些人具有预期的输出,但有些人没有。 我认为这是C或GCC版本的问题。 它可以解决吗? 关于为什么在我的C版本中会发生这种情况,是否有任何解释?

最奇怪的是,即使我取消了指针的引用,它仍然会打印一些地址。 这怎么可能?

另一方面,如果我将程序更改为此:

$include <stdio.h>

struct time
{
    int hours ;
    int minutes ;
    int seconds ;
} t[2] = {1,2,3,4,5,6};

int main() {    
    struct time *tt = t;
    printf("%d\n", (*tt).hours);
    printf("%d", (*(tt+1)).hours);
}

它输出预期的输出。

这种行为的解释是什么? 谢谢。

问题不在于编译器,而是您对C的理解。让我们使用GCC版本7.3.0(Ubuntu 7.3.0-27ubuntu1〜18.04)进行编译:

% gcc struct_time.c      
struct_time.c: In function ‘main’:
struct_time.c:12:14: warning: format ‘%d’ expects argument of type ‘int’, 
          but argument 2 has type ‘struct time’ [-Wformat=]
     printf("%d\n", (*tt));
             ~^     ~~~~~
struct_time.c:13:14: warning: format ‘%d’ expects argument of type ‘int’,
          but argument 2 has type ‘struct time’ [-Wformat=]
     printf("%d", *(tt+1));
             ~^   ~~~~~~~

您的格式为%d ,它需要一个int作为相应的参数,并且您要传递struct time 程序的行为是不确定的,因为转换说明符与实际参数的类型不匹配。

值在内存中的位置无关紧要-它们的类型也很重要。 即使tt[0]的地址与tt[0].hours ,它们的类型也不同。 在一个中,您需要整个结构,在另一个中,您需要第一个成员中包含的值。

您的代码无效。 这是您的编译器应产生的错误(也许您未启用警告?):

error: format specifies type 'int' but the argument has type 'struct time' [-Werror,-Wformat]
    printf("%d\n", (*tt));

您根本无法编写这样的代码,然后抱怨其行为。 您告诉printf()传递整数,然后传递结构。 什么事情都可能发生。

为了获得加分,您遇到了样式问题,合理的编译器也会警告您:

error: suggest braces around initialization of subobject [-Werror,-Wmissing-braces]
} t[2] = {1,2,3,4,5,6};

那是因为您要用一个数字列表来初始化2个结构。 它应该是{{1,2,3},{4,5,6}}

它的行为正常,因为该数组用作指针(100%正常)

因此tt指向第一个数组元素(索引为0的数组元素),而tt + 1指向第二个数组元素(索引为1)。

当您向该指针添加一个指针(并且该指针属于指向该结构的类型的指针)时,生成的指针将引用该类型的下一个结构。

如果取消引用结构或联合的指针,请使用->

(*tt).hours == tt -> hours(tt + 1).hours == (tt + 1) -> hours

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM