2011-06-06 78 views
0

這是可以接受的代碼?:這是可接受的練習初始化堆上的數組?

unsigned char *buffer= malloc(16 * sizeof(*buffer)); 
     if (buffer == NULL) { 
      errorText.text= @"Insufficient memory."; 
      NSLog(@"%@",@"Insufficient memory."); 
      return; 
     } 
     unsigned char temp[16]= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 
     memcpy(buffer,temp,16); 
     NSData* seed= [NSData dataWithBytesNoCopy:buffer length:16]; 

或:

unsigned char *buffer= malloc(16 * sizeof(*buffer)); 
if (buffer == NULL) { 
    errorText.text= @"Insufficient memory."; 
    NSLog(@"%@",@"Insufficient memory."); 
    return; 
} 
memset(buffer,0,16); // set all bytes to zero 
buffer[0]= 0x01; 
buffer[1]= 0x02; 
buffer[2]= 0x03; 
buffer[3]= 0x04; 
buffer[4]= 0x05; 
buffer[5]= 0x06; 
buffer[6]= 0x07; 
buffer[7]= 0x08; 
buffer[8]= 0x09; 
buffer[9]= 0x0a; 
buffer[10]= 0x0b; 
buffer[11]= 0x0c; 
buffer[12]= 0x0d; 
buffer[13]= 0x0e; 
buffer[14]= 0x0f; 
buffer[15]= 0x10; 
NSData* seed= [NSData dataWithBytesNoCopy:buffer length:16]; 

我的C是有點生疏!

+1

而不是使用' memset',爲什麼不使用'calloc'? – 2011-06-06 22:43:17

+0

@Jacob ...對memset的調用是可選的,所以我將它編碼爲單獨的,以便稍後將其註釋掉。你認爲堆棧上的臨時陣列是否合理?使用初始化器編碼實際的種子更容易。 – JAL 2011-06-07 00:06:12

回答

0

[編輯刪除有關未使用malloc與dataWithBytesNoCopy虛假諮詢]

另一種選擇是隻使用-dataWithBytes:讓NSData的照顧複製給你:

static unsigned char seedBytes[16]= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 
    NSData* seed= [NSData dataWithBytes:seedBytes length:16]; 
+0

Hi @David Gelhar ...好點,我願意諒解。我打電話給malloc,因爲線上調用malloc的例子和文檔說:「一個包含新對象數據的緩衝區,bytes必須指向一個用malloc分配的內存塊。」此外,缺省似乎是freeWhenDone:YES,因爲「如果是,則返回的對象獲取字節指針的所有權並在釋放時釋放它。」所以我的朦朧的理解是,我打電話malloc和NSData電話免費。這似乎類似於我從DLL傳遞的CComBSTR上調用CopyTo。 – JAL 2011-06-07 02:31:51

+0

關於'-dataWithBytesNoCopy:'釋放其參數的事實的好處;我錯過了(不傾向於使用那個API)。我會更新答案... – 2011-06-07 04:49:27

+0

現在我不知道我是如何錯過dataWithBytes的!謝謝。我覺得必須有一個更簡單的方法來做到這一點。 – JAL 2011-06-07 05:14:22