安全地调整结构

时间:2011-06-14 09:08:31

标签: c struct malloc

当在代码时不知道某些成员的大小时,我想要一些关于处理struct的安全方法的建议。

例如,我有一个名为“频道”的结构。该结构具有成员名称“AudioSourceOBJ”,它是指向名为“AudioSource”的其他结构类型的数组的指针。在程序运行之前,我不知道每个通道有多少AudioSource。我这样处理。

频道对象

struct channelobj {

        AudioUnitSampleType *leftoutput;
    AudioUnitSampleType *rightoutput;
    AudioSourceOBJ *audioSource;



};

的AudioSource

struct audiosourceobj {


    AudioUnitSampleType   *leftoutput;
    AudioUnitSampleType   *rightoutput;


};

创建可变大小的结构

void createInputs(ChannelOBJ channel,int numAudioInputs)
{
    channel->audioSource=(AudioSourceOBJ *)malloc(numAudioInputs * sizeof(AudioSourceOBJ));

    for (int i=0;i<numAudioInputs;i++)
    {
        AudioSourceOBJ obj;
        obj=newAudioSourceOBJ();
        channel->audioSource[i]=obj;

    }
}

我认为这是o.k?

我现在面临的问题是,即使我可以在我的通道结构中为正确数量的音频对象分配内存,音频源结构中的leftoutput和rightoutput数组也不会在程序的后面设置。它们将填充大量数据,并且在应用程序的整个生命周期内可能会改变大小和内容。

每次我想对单个音频对象进行更改时,是否必须完全重新显示包含音频源的频道?

有什么安全的方法可以做到这一点,还是有更好的方法?

2 个答案:

答案 0 :(得分:2)

“每次我想对单个音频对象进行更改时,是否必须完全重新显示包含音频源的频道?”

没有。例如,您可以替换i音频源的左侧输出,如下所示:

free(channel->audioSource[i].leftoutput);
channel->audioSource[i].leftoutput = malloc(newSize * sizeof(AudioUnitSampleType));

甚至:

AudioUnitSampleType *tmp = realloc(channel->audioSource[i].leftoutput,
    newSize * sizeof(*tmp));
if (tmp == 0) { /* handle the error */ }
channel->audioSource[i].leftoutput = tmp;

顺便说一下,如果您不发布实际代码,答案可能会包含由于示例中的错误而导致的错误。

您的代码在指针和对象之间似乎存在一些混淆,例如channel参数的类型为ChannelOBJ,然后您将其用作指针。这是一个错误,还是ChannelOBJ struct channelobj*的typedef?通常使用typedef隐藏某些东西是 not 更好。

如果AudioUnitSampleType同样是一个指针类型,那么我上面的第一个代码片段是不完整的,因为它还需要释放数组元素指向的旧对象,并分配新的对象。第二个需要释放旧的根据大小是增加还是减少来分配新的。

答案 1 :(得分:1)

不,您不必调整已分配的AudioSourceObj结构块的大小。 leftoutputrightoutput只是固定大小的指针(不是可变大小的数组),可以通过单独malloc分配地址:

channel->audioSource[i].leftoutput = malloc(5 * sizeof(AudioUnitSampleType));