尝试在C中声明指向typedef结构的指针

epggiuax  于 2023-02-18  发布在  其他
关注(0)|答案(2)|浏览(139)

将一些Python代码转换成C. 'just'想要声明一个typedef结构和一个指向它的指针...这是在printf(“byte order %p\n”,info-〉byte_order)中的分段;这应该怎么做?请帮助。试图遵循C typedef of pointer to structure,但我猜它已经过时了。

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <inttypes.h>
#include <Byteswap.h>

#define WFM_HEADER_SIZE 838

typedef struct WfmInfo{
  uint16_t byte_order;
//  char version[8];
  uint32_t imp_dim_count;
  uint32_t exp_dim_count;
  uint32_t record_type;
  uint32_t exp_dim_1_type;
  uint32_t time_base_1;
  uint32_t fastframe;
  uint32_t Frames;
  double   tstart;
  double   tscale;
  double   tfrac;
  double   tdatefrac;
  int32_t  tdate;
  uint32_t dformat;
  double   vscale;
  double   voffset;
  uint32_t pre_values;
  uint32_t post_values;
  uint32_t avilable_values;
  uint32_t dpre;
  uint32_t dpost;
  uint16_t bps;
  uint32_t code;
  uint32_t readbytes;
  uint32_t allbytes ;
  uint32_t samples;
  uint64_t curve_offset;
  uint32_t available_values;
} WfmInfo;

typedef WfmInfo* WfmInfo_ptr;

int testFuck(){
    WfmInfo_ptr info;
    printf( "info address %p\n", info);
    printf( "byte order %p\n", info->byte_order);
    cout<<"info declared"<<endl;
    return 0;
}
oknwwptz

oknwwptz1#

这里是一个最小的例子。
我想要声明一个typedef结构和指向它的指针...
编译如下:

gcc main.c -o main
./main

输出如下所示:
x一个一个一个一个x一个一个二个x

nwlqm0z1

nwlqm0z12#

您的typedefs是正确的,WfmInfo_ptr是指向WfmInfo结构的指针的类型。
main函数中的问题是您定义了这样一个指针info,但没有初始化它,因此两个printf调用都有未定义的行为:

  • printf( "info address %p\n", info);具有未定义的行为,因为%p需要void *,而您提供了WfmInfo *,该WfmInfo *在传递给vararg函数时未进行隐式转换
  • info未初始化,因此即使它作为(void *)info传递,输出也没有意义。
  • printf( "byte order %p\n", info->byte_order)具有未定义的行为,因为您取消引用了未初始化的指针info
  • cout<<"info declared"<<endl;是C++代码,而不是C。

还要注意的是,在typedef后面隐藏指针被认为是容易混淆和出错的。
info定义为WfmInfo *info;非常容易理解,并且很明显info是一个没有隐式初始化的指针(不像C++中的结构或类可能有默认构造函数)。

相关问题