当某些成员的大小在代码时未知时,我想要一些关于处理结构的安全方法的建议。
例如,我有一个名为“Channel”的结构。此结构有一个成员名称“AudioSourceOBJ”,它是指向名为“AudioSource”的其他结构类型的数组的指针。在程序运行之前,我不知道每个 channel 会有多少个 AudioSources。我是这样处理的。
channel 对象
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;
}
}
我觉得这样可以吗?
我现在面临的问题是,即使我可以为 channel 结构中正确数量的音频对象分配内存,音频源结构中的 leftoutput 和 rightoutput 数组直到稍后在程序中才会被设置。它们将填充少量数据,并且可能会在应用程序的整个生命周期内改变大小和内容。
每次我想对单个音频对象进行更改时,我是否必须完全重新分配包含音频源的 channel ?
执行此操作的安全方法是什么,或者是否有更好的方法?
最佳答案
“每次我想对单个音频对象进行更改时,我是否必须完全重新分配包含音频源的 channel ?”
没有。例如,您可以像这样替换第 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 隐藏某物是指针。
如果 AudioUnitSampleType 同样是指针类型,那么我上面的第一个代码片段是不完整的,因为它还需要释放数组元素指向的旧对象,并分配新对象。第二个需要根据大小是增加还是减少来释放旧的或分配新的。
关于c - 安全调整结构大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6341369/