2010-11-30 40 views
0

假設我分配了一些內存。將分配的內存視爲不同的類型

char* buffer = (char*)my_malloc(2062); 

我將char值賦給前面定義的數組命名頭的前14個字節。

memcpy(buffer, header, 14); 

然後我想把剩餘的分配空間當作指針來浮動。

float* float_buffer = (float*)(buffer + 14); 
some_function(float_buffer); 

然後在稍後的某個時刻我需要發送所有的數據。

transmit(buffer); 
my_free(buffer); 

這是治療記憶的正確方法嗎?浮球*投射好嗎?我遇到的問題是我正在失去價值,而沒有得到正確的結果。 我的問題是: 如果您必須將分配的內存視爲不同的類型,但在處理結束時將其作爲char *發送.....這是正確的方式嗎?

我檢查了ptr值,當它們是float *和char *時它們是相同的,但我沒有得到正確的結果。

我的一個限制是我最初只能從靜態緩衝區分配一塊內存。因此,不允許將另一個malloc作爲另一個類型(float *)調用。

+0

這聽起來像你有一個對齊問題;你能展示預期的結果和你看到的實際錯誤嗎? – 2010-11-30 06:09:34

+0

是的,這是一個對齊問題......我不知道的東西。我可以從這裏拿走它。謝謝。 – 2010-11-30 06:46:49

回答

3

爲了使這項工作(至少可移植),你必須確保(至少)float_buffer是sizeof(float)對齊的。你可以通過分配sizeof(float) - 1個額外的字節,觀察malloc調用的模數sizeof(float)的結果,並忽略前幾個字節來做到這一點。 (當然,爲了進行免費()調用,您必須保留原始指針。)

雖然您可能不想這樣做。這聽起來像'緩衝區'的目的是積累數據通過網絡發送或類似的東西,而浮動將被從其他地方複製。你真正應該做的是另一種方式:將緩衝區作爲char []始終處理,並在源文件複製時將源浮點數重新解釋爲一系列字符。也就是說

char* buffer = malloc(total_size); 
char* float_start = buffer + header_size; 
memcpy(float_start, (char*)float_source, sizeof(float) * float_count); 
transmit(buffer, total_size); 
free(buffer); 
+0

+1避免校準頭痛的好方法。 – 2010-11-30 06:10:54

0

我在這裏猜測,但由於原型的malloc是

void *malloc(size_t size); 

你基本上是鑄造void *類型的緩衝區爲char *,所以後來鑄造緩衝的另一塊浮動*將會很好,只要你照顧好指針會計。

3

從概念上講,這是可以的 - 但你必須做一些額外的工作來確保它能可靠地工作。

一個潛在的問題是,你不能只訪問任何地址作爲float。可能有特定的對齊要求 - 由malloc()返回的地址需要被正確對齊以訪問任何類型,但是一旦您將14添加到該地址,所有投注都將關閉(char除外)。

爲確保正確對齊,您必須確保您添加到buffer的地址是sizeof(float)的倍數。你可以通過添加填充使用下面的公式:

#define PAD_OFFSET(offset, type) ((offset) + sizeof(type) - 1) & ~(sizeof(type) - 1)) 

float *float_buffer = (float *)(buffer + PAD_OFFSET(14, float)); 

注意這將創建一個空白 - 填充 - 您的字符和你的彩車之間。

或者,您可以定義一個struct,編譯器會爲您填充填充。這將使用稱爲靈活數組成員 C99的功能:

struct foo { 
    char abc[14]; 
    float xyz[]; 
}; 

struct foo *buffer = malloc(2062); 
memcpy(&buffer->abc, header, 14); 
some_function(&buffer->xyz); 
transmit(buffer); /* Presuming transmit() expects a void * parameter. */ 

如果你想做到這一點沒有填充,你不能直接訪問內存中buffer作爲花車 - 你必須創建一個臨時數組並將其複製到:

float temp[500]; /* Or whatever size */ 
some_function(&temp); 
memcpy(buffer + 14, temp, sizeof temp); 
相關問題