当在代码时不知道某些成员的大小时,我想要一些关于处理struct的安全方法的建议。
例如,我有一个名为“频道”的结构。该结构具有成员名称“AudioSourceOBJ”,它是指向名为“AudioSource”的其他结构类型的数组的指针。在程序运行之前,我不知道每个通道有多少AudioSource。我这样处理。
struct channelobj {
AudioUnitSampleType *leftoutput;
AudioUnitSampleType *rightoutput;
AudioSourceOBJ *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数组也不会在程序的后面设置。它们将填充大量数据,并且在应用程序的整个生命周期内可能会改变大小和内容。
每次我想对单个音频对象进行更改时,是否必须完全重新显示包含音频源的频道?
有什么安全的方法可以做到这一点,还是有更好的方法?
答案 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
结构块的大小。 leftoutput
和rightoutput
只是固定大小的指针(不是可变大小的数组),可以通过单独malloc
分配地址:
channel->audioSource[i].leftoutput = malloc(5 * sizeof(AudioUnitSampleType));