c - 安全调整结构大小

标签 c struct malloc

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

例如,我有一个名为“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 类型,那么您使用它就好像它是一个指针.这是一个错误,还是 ChannelOBJstruct channelobj* 的类型定义?通常最好不要使用 typedef 隐藏某物是指针。

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

关于c - 安全调整结构大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6341369/

相关文章:

c++ - 创建一个结构数组但稍后定义大小?

正确的二维数组内存分配/解除分配?

c++ - 使用 malloc() 初始化类

将结构转换为成员类型的指针

c - 复制结构时出现段错误

c++ - 如何解决这两个错误? ‘strlwr’- 'but argument 2 has type ‘int’'

unsigned char 中的 C 变量参数?

c - getline 不将字符串存储在变量中

c - C 中有很多错误, "redefinition"错误等等

c - scanf 发出多个输入