1
真的基本問題在這裏:memset做什麼(在CoreAudio中使用)?
我見過一堆CoreAudio代碼,它在處理結構時使用了memset
,我還沒有弄清楚爲什麼。這是來自.m ObjC文件。
下面是從下面的代碼塊中的行:
memset(&clientFormat, 0, sizeof(clientFormat));
// ---------------
AudioStreamBasicDescription clientFormat;
if (sourceFormat.mFormatID == kAudioFormatLinearPCM) {
clientFormat = sourceFormat;
} else {
memset(&clientFormat, 0, sizeof(clientFormat));
int sampleSize = sizeof(AudioSampleType);
clientFormat.mFormatID = kAudioFormatLinearPCM;
clientFormat.mFormatFlags = kAudioFormatFlagsCanonical;
clientFormat.mBitsPerChannel = 8 * sampleSize;
clientFormat.mChannelsPerFrame = sourceFormat.mChannelsPerFrame;
clientFormat.mFramesPerPacket = 1;
clientFormat.mBytesPerPacket = clientFormat.mBytesPerFrame = sourceFormat.mChannelsPerFrame * sampleSize;
clientFormat.mSampleRate = sourceFormat.mSampleRate;
}
我想添加一些東西(如果我錯了,請糾正我):這是必要的,否則如果你沒有明確地在clientFormat中設置一個屬性,它將有一個不確定的值(取決於在記憶之前)。如果這是一個用於製作GL紋理的像素緩衝區,或者CGImage,其中您將立即覆蓋每個字節,則不需要。 – borrrden 2012-04-11 02:32:06
確實。除非你知道內存將被正確填充,否則'memset()'仍然是一個好習慣。 – 2012-04-11 02:50:40
好的 - 我明白了。沒有memset,所有的結構字段必須設置(0或其他有效值) - 謝謝! (對於老專業人士來說,這些無疑是微不足道的問題,但由於它們非常基本,所以很多書籍/教程都假設知道這些東西) – 2012-04-11 03:36:03