2012-04-11 31 views
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; 
} 

回答

1

作爲調用時,它設置內存爲&clientFormat,長度爲sizeof(clientFormat),至0。這是必需的,因爲在使用malloc()和大多數其他分配函數分配之後,C中的內存未被清除爲0

+0

我想添加一些東西(如果我錯了,請糾正我):這是必要的,否則如果你沒有明確地在clientFormat中設置一個屬性,它將有一個不確定的值(取決於在記憶之前)。如果這是一個用於製作GL紋理的像素緩衝區,或者CGImage,其中您將立即覆蓋每個字節,則不需要。 – borrrden 2012-04-11 02:32:06

+0

確實。除非你知道內存將被正確填充,否則'memset()'仍然是一個好習慣。 – 2012-04-11 02:50:40

+0

好的 - 我明白了。沒有memset,所有的結構字段必須設置(0或其他有效值) - 謝謝! (對於老專業人士來說,這些無疑是微不足道的問題,但由於它們非常基本,所以很多書籍/教程都假設知道這些東西) – 2012-04-11 03:36:03

相關問題