2012-04-11 6 views
1

Wirklich grundlegende Frage hier:Was macht memset (wie in CoreAudio)?

Ich habe eine Reihe von CoreAudio- Code gesehen, die memset verwendet, um mit structs Umgang und ich habe nicht in der Lage gewesen, herauszufinden, warum. Dies ist aus einer .m ObjC-Datei.

Hier ist die Linie von dem Codeblock unter:

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; 
} 

Antwort

1

Wie genannt, setzt die Speicher bei &clientFormat, mit einer Länge von sizeof(clientFormat), bis 0. Dies ist erforderlich, da der Speicher in C nach der Zuweisung mit malloc() und den meisten anderen Zuweisungsfunktionen nicht auf 0 zurückgesetzt wird.

+0

Ich möchte etwas hinzufügen (und wenn ich falsch liege, bitte korrigieren Sie mich): Dies ist notwendig, denn sonst, wenn Sie nicht explizit eine Eigenschaft in clientFormat setzen, wird es einen unbestimmten Wert haben (abhängig davon, was war) Speicher davor). Wenn dies beispielsweise ein Pixelpuffer zum Erstellen einer GL-Textur oder CGImage wäre, in dem Sie jedes Byte sofort überschreiben, wird es nicht benötigt. – borrrden

+0

In der Tat. :) Es ist immer noch eine gute Übung, 'memset()' zu verwenden, es sei denn, Sie wissen, dass der Speicher ordnungsgemäß gefüllt wird. –

+0

ok- ich verstehe es. Ohne memset müssten alle Strukturfelder gesetzt werden (auf 0 oder einen anderen gültigen Wert) - Danke! (zu alten Profis - das sind zweifelsohne triviale Fragen, aber da sie so einfach sind, gehen viele Bücher/Tutorials davon aus, dass man das weiß) –