簡體   English   中英

Memset 定義和使用

[英]Memset Definition and use

function memset()有什么用處?

定義:將ptr指向的memory塊的前num字節設置為指定值(解釋為無符號字符)。

這是否意味着它對 memory 地址中的值進行硬編碼?

memset(&serv_addr,0,sizeof(serv_addr)是我試圖理解的例子。

有人可以用非常簡單的方式解釋嗎?

memset()是相對簡單操作的非常快速的版本:

void* memset(void* b, int c, size_t len) {
    char* p = (char*)b;
    for (size_t i = 0; i != len; ++i) {
        p[i] = c;
    }
    return b;
}

也就是說, memset(b, c, l)將從地址b開始的l個字節設置為值c 它的執行速度比上述實現要快得多。

memset()通常用於初始化值。 例如,考慮以下結構:

struct Size {
    int width;
    int height;
}

如果您像這樣在堆棧上創建其中之一:

struct Size someSize;

然后該結構中的值將是不確定的。 它們可能為零,也可能是上次使用那部分堆棧時發生的任何值。 所以通常您會遵循以下原則:

memset(&someSize, 0, sizeof(someSize));

當然,它也可以用於其他情況,這只是其中之一。 只需將其視為簡單地將一部分內存設置為某個值的方法即可。

memset是一種將內存區域設置為0的常用方法,而與數據類型無關。 可以說memset不在乎數據類型,而只是將所有字節設置為零。

C ++中的IMHO應該避免在可能的情況下執行memset ,因為它會繞過C ++提供的類型安全,而應該使用構造函數或初始化作為初始化的手段。 在類實例上完成的memset可能還會無意中破壞某些內容:

例如

class A
{
public:
  shared_ptr<char*> _p;
};

上面實例的memset不能正確執行參考計數器遞減。

我猜serv_addr是某些struct類型的本地變量或全局變量-也許是struct sockaddr (或者可能是一個class )。

&serv_addr正在獲取該變量的地址。 這是有效的地址,作為memset第一個參數給出。 memset的第二個參數是用於填充的字節(零字節)。 memset的最后一個參數是要填充的內存區域的大小(以字節為單位),它是示例中該serv_addr變量的大小。

因此,此對memset調用將清除包含某些struct的全局或局部變量serv_addr

實際上, GCC編譯器在進行優化時會為此生成聰明的代碼,通常會對其進行展開和內聯(實際上,它通常是內置的,因此GCC可以為其生成非常聰明的代碼)。

就是將內存設置為特定值。

這是示例代碼。

Memset(const * p,unit8_t V,unit8_t L),這里P是指向目標內存的指針,V是指向目標緩沖區的值,該值將被設置為值V,而l是數據的長度。

while(L --> 0)
{
    *p++ = V;
}

memset-設置內存中的字節

概要-

#include<string.h>

無效* memset(無效* s,int c,size_t n)

描述-memset()函數應將c(轉換為無符號字符)復制到s所指向的對象的前n個字節中的每個字節中。 對於上述函數,memset()將返回s的值。

serv_addr = {0};而不是增加對 memset 的例行調用開銷; 也可以做

暫無
暫無

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

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