簡體   English   中英

在C中復制未簽名的char

[英]Copying unsigned char in C

我想使用memcpy,但在我看來它是從一開始就復制數組?

我希望從A[a]復制到A[b] 因此,我找到了另一種方法,

void copy_file(char* from, int offset, int bytes, char* to) {
    int i;
    int j = 0;
    for (i = offset; i <= (offset+bytes); i++) to[i] = from[j++];
}

我遇到段錯誤,但我不知道從哪里得到段錯誤? 每個條目包含8個字節,所以我的第二次嘗試是

void copy_file(char* from, int offset, int bytes, char* to) {
    int i;
    int j = 0;
    for (i = 8*offset; i <= 8*(offset+bytes); i++) to[i] = from[j++];
}

但仍然是段錯誤。 如果您需要更多信息,請隨時詢問!

我遇到段錯誤,但我不知道從哪里得到段錯誤?

主要建議:學習使用調試器。 它提供有關錯誤指令的有用信息。


為了回答您對上述問題中顯示的代碼段的查詢,

  1. 檢查傳入的指針( tofrom )對NULL取消引用之前。
  2. 檢查所使用索引的邊界限制。 當前,它們可以超出分配的內存。

正確使用memcpy()

根據手冊頁memcpy()的簽名指示

void * memcpy(void * dest,const void * src,size_t n);

它將src n個字節從地址指針復制到dest指向的地址。

另外,需要注意的一個非常重要的點是:

存儲區域不得重疊。

因此,要將A [a]復制到A [b],您可以編寫如下內容

memcpy(destbuf, &A[a], (b-a) );

在我看來, memcpy從一開始就復制了數組

不,不是的。 實際上, memcpy絲毫不知道它是在數組中復制還是復制到數組。 它將其參數視為指向非結構化內存塊的指針。

如果希望從A[a]復制到A[b] ,請將地址A[a]以及A[b]A[a]之間的字節數傳遞給memcpy ,如下所示:

memcpy(Dest, &A[a], (b-a) * sizeof(A[0]));

這會將A的內容從索引a (包括索引)復制到索引b (不包括索引)復制到Dest指向的存儲塊中。 如果您也希望對Dest應用偏移量,請對第一個參數使用&Dest[d] 對於char ,signed或unsigned以外類型的數組,必須通過sizeof乘法sizeof

將最后一行從

for (i = offset; i <= (offset+bytes); i++)
to[i] = from[j++];

for (i = offset; i <= bytes; i++,j++)
to[j] = from[i];

這對我來說很好。 我考慮過offset是數組的開始, byte是數組的結束。 即復制from[offset]from[bytes]to[]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM