找不到。结构数组中的元素?

时间:2012-02-07 03:33:57

标签: c

这很奇怪,因为我之前已经做过,但它只是不起作用。我有这样的结构xmp_frame

typedef struct {
    short int attr_dtype;
    short int attr_code;
    short int attr_len;
    const char *attr;
}xmp_frame;

现在我创建一个xmp_frame数组,并使用它们:

xmp_frame frame_array[]={
    {1,2,strlen("Hello there"),"Hello there"},
    {1,3,strlen("This is not working"),"This is not working"},
    {0,3,strlen("But why??"),"But why??"}
};

现在我有一个例程,基本上将frame_array写入文件:

short int write_frames(xmp_frame frame_array[],FILE *outfp){

}

在我写frame_array之前,我需要得到否。 frame_array[]中的元素用于进行某些处理。所以我们这样做(通常):

short int write_frames(xmp_frame frame_array[],FILE *outfp) {
    short intnum_frames=sizeof(frame_array) / sizeof(frame_array[0]);
   /*But i get the value of num_frames as 0. I will print the outout of some debugging.*/ 

    fprintf(stderr,"\n Size of frame_array : %lu",sizeof(frame_array));  //prints 8
        fprintf(stderr,"\n Size of frame_array[0] : %lu",sizeof(frame_array[0])); //prints 16
       fprintf(stderr,"\n So num. of frames to write  : %d",  (sizeof(frame_array))/(sizeof(frame_array[0]))); //prints 0 
}

当然,如果frame_array为8个字节且frame_array[0]为16个字节,那么num_frames将为0。

但问题是数组的大小如何小于其中一个元素?我听说过字节填充。

如果它导致问题,我没有太多想法。这是我提到的链接之一:       Result of 'sizeof' on array of structs in C?

虽然我找到了一些确定结构数组大小的变通方法。

  1. 得到号码。来自呼叫者的元素和

  2. 另一个是强制性地将最后一个struct元素作为{0,0,0,NULL}然后 在write()中检查它是否存在并再次停止扫描frame_array

  3. 但两者都取决于来电者,这是你无法信任的。 那么真正的问题在哪里呢?我怎样才能确定num_frames的价值?

3 个答案:

答案 0 :(得分:4)

数组作为指针传递给函数,因此您看到的8个字节实际上是指针的大小(假设您使用的是64位)而不是原始数组的大小。无法检索指向数组的实际大小,因此您必须将其单独传递给函数。

答案 1 :(得分:1)

一旦将数组作为参数传递给函数,就无法知道数组的大小。您需要传递数组中元素的数量。

short int write_frames(xmp_frame frame_array[], int num_frames,FILE *outfp)
{
    for(int i=0; i < num_frames; i++)
        // write frame_array[i]
}

答案 2 :(得分:0)

您可以使用此功能执行此操作:

p = com.cameronpalmer.MyProtobufWrapper.newBuilder();
p.setIdentifier(java.util.UUID.randomUUID().toString());
p.setTimestampMilliseconds(timestamp);
p.setAngleRadians(0);
p.addAllChannelSamples(channel_vector);

planeWaveBuilt = p.build();
byteArray = planeWaveBuilt.toByteArray();

并在需要时使用结构数组指针调用它。