2015-03-31 65 views
0

是否有 「C」 投下(PTR爲const結構)的方式(PTR到UINT8)
投射(PTR爲const)至(PTR到UINT8)

以下函數需要(PTR到UINT8)

memcopy((uint8 *) destination, (uint8 *) source , uint16 _size); 

函數擬類型的緩衝液((PTR爲const))複製到另一緩衝器

我知道在C++ i可以用const_cast拋擲(刪除)常量性或波動性。但是C呢?

當前情況如下: 說我有一個結構main_S

struct main_S { 
strcut1 xxxx1 
strcut2 xxxx2 
strcut3 xxxx3 
} 

的指針main_S strcut是(ptrcnst_Main),這是一個指針常量。

我需要的main_S 的第二個元素(XXXX2)複製,所以我會做以下

strcut2 dest; 
memcopy((uint8 *) &destination, (uint8 *) ptrcnst_Main->xxxx2 , SizeOf(strcut2)); 

但是,這永遠不會奏效。並且我一直有錯誤,我不能將ptr常量轉換爲ptr-uint8

+1

爲什麼函數參數'source'不是'const',類似於庫函數'void * memcpy(void * dest,const void * src,size_t count)'? – 2015-03-31 22:39:00

+0

嗯,我忘了提及(ptr爲const)是(ptr爲const結構類型),我必須將它轉換爲uint8以將其與memcopy函數一起使用,@WeatherVane – 2015-03-31 22:48:51

+0

您的意思是'memcpy'而不是'memcopy '? – 2015-03-31 22:51:36

回答

1

UPDATE

我剛剛看了你的評論,它變得陌生...該代碼是非常近似的,但我會盡力爲您解決問題。

strcut2 dest; 
memcopy((uint8 *)&dest, (uint8 *)&(ptrcnst_Main->xxxx2) , SizeOf(strcut2)); 

嘗試在你的ptrcnst_Main->xxxx2前加上符號(&),並把剛纔像我一樣括號。


通常情況下,當你不應用任何更改源緩衝區拷貝從一個緩衝到另一個數據,需要聲明的變量作爲一個常量指針,因爲它不會改變!這是一個緩衝區。所以在這裏,你的指針source應該是const uint8 *source。即使它是一個常量指針,你也可以讀取裏面的值。

const限定在非可變數據上(閱讀「不需要更改的數據」),這對您和您的每一位同事都是一個很好的做法。

結論 你並不需要從const投什麼非const。常量變量仍然可以被讀取。

然而,我會回答你原來的問題是:

是否有 「C」 的方式投下(PTR爲const)至(PTR到UINT8)?

在C語言中,你只需投如下:(type) variable

例如:

const char* c1 = malloc(sizeof(char) * 5); 
char* c2 = (char*)c1; // cast is here 
for (int i = 0; i < 5 ; i++) { 
    c2[i] = 'i'; 
} 
printf("%s\n", c1); 

但它是一個非常不好的做法,去掉常量性。如果它是恆定的,那通常是有意的。

說明:這段代碼在很多方面都不好,但爲了演示的目的,我保持簡單。

+2

很可能他不得不拋棄const,因爲他的自制memcopy()在沒有正確的const正確性的情況下得到了一個糟糕的函數原型。所以實際的問題是memcopy的函數聲明。 – Lundin 2015-04-01 06:51:10

+0

就像我懷疑的那樣。感謝啓發。 – 2015-04-02 07:15:26

0

對於C,您使用常規的C風格強制轉換來強制轉換const。例如:

void f(const int *src,int *dst,int n) 
{ 
    memcopy((uint8_t*)dst,(uint8_t*)src,n*sizeof(int)); 
} 

請注意,實際寫入最初聲明爲const的對象是未定義的行爲,所以要小心。

相關問題