标签: memset

在使用之前将结构如sockaddr_in,sockaddr_in6和addrinfo归零时,这是正确的:memset,初始化器还是其中之一?

每当我在书籍,手册页和网站中查看真实代码或示例套接字代码时,我几乎总会看到类似下面的内容:

struct sockaddr_in foo;
memset(&foo, 0, sizeof foo); 
/* or bzero(), which POSIX marks as LEGACY, and is not in standard C */
foo.sin_port = htons(42);
Run Code Online (Sandbox Code Playgroud)

代替:

struct sockaddr_in foo = { 0 }; 
/* if at least one member is initialized, all others are set to
   zero (as though they had static storage duration) as per 
   ISO/IEC 9899:1999 6.7.8 Initialization */ 
foo.sin_port = htons(42);
Run Code Online (Sandbox Code Playgroud)

要么:

struct sockaddr_in foo = { .sin_port = htons(42) }; /* New in C99 */ …
Run Code Online (Sandbox Code Playgroud)

c sockets memset

22
推荐指数
1
解决办法
9261
查看次数

去掉memset的模拟吗?

在C++中,我可以使用memset初始化一个带有一些值的数组:

const int MAX = 1000000;
int is_prime[MAX]

memset(is_prime, 1, sizeof(is_prime))
Run Code Online (Sandbox Code Playgroud)

什么memset做的,粗略地可以被描述为填充数组有一些价值,但这样做真的非常快.

我可以这样做is_prime := make([]int, 1000000),但这将创建一个全0的切片,以我可以使用的类似方式new([1000000]int),但没有任何东西可以让我创建一个包含所有1或任何其他非零元素的数组/切片.

当然我可以使用循环用稍后的值填充它,但主要目的memset是它比循环更快.

那么Go程序员是否有memset模拟(将数组初始化为某些非零值的快速方法)?

memset go slice

18
推荐指数
2
解决办法
5856
查看次数

C中的memset和memcpy有什么区别

我已经阅读了函数头文件,但我仍然不确定在用例方面究竟有什么区别.

c memset memcpy

17
推荐指数
2
解决办法
3万
查看次数

使用memset初始化结构数组

gcc 4.4.4 c89

我有以下结构.

struct device_sys
{
    char device[STRING_SIZE];
    int id;
    char category;
};

int main(void)
{
    struct device_sys dev_sys[NUM_DEVICES];

    memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(dev_sys));

    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

当我调用memset时,我得到一个堆栈转储.这不是初始化结构数组的正确方法吗?

c memset

17
推荐指数
2
解决办法
7万
查看次数

c语言的memset函数

我现在正在研究memset函数,但所有示例都与char数组有关,如下所示:

char a[100];
memset(a, 0, 100);
Run Code Online (Sandbox Code Playgroud)

它会将此char数组中的每个元素设置为0.

我想知道memset是否可以应用于int数组或float数组?

c arrays memset

16
推荐指数
1
解决办法
3万
查看次数

如何使用memset将volatile数组设置为零?

volatile uint8_t reset_mask[768] = {0}
Run Code Online (Sandbox Code Playgroud)

现在我在一个内部操作期间将此数组元素的值设置为1.

在另一个函数调用中,我需要将此数组的所有元素设置为0.一种方法是使用for循环,但我相信更好的方法来分配数组的所有元素是使用memset

memset(reset_mask, 0, sizeof(reset_mask));
Run Code Online (Sandbox Code Playgroud)

但是我收到了这个错误: - "从类型'易失性uint8_t*{aka volatile unsigned char*}'转换为'void*'类型转换为限定符"

如果我们不能在这里使用memset,有没有更好的方法一次性设置这个volatile数组的所有元素?

c++ arrays volatile memset

16
推荐指数
2
解决办法
4676
查看次数

如何memset()内存到某个模式而不是单个字节?

我今天面临一个问题,我需要将内存更改为某种模式,如0x 11223344,以便整个内存看起来像(十六进制):

1122334411223344112233441122334411223344112233441122334411223344...
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何使用memset(),因为它只需要一个字节,而不是4个字节.

有任何想法吗?

谢谢,Boda Cydo.

c memory design-patterns memset

15
推荐指数
4
解决办法
1万
查看次数

如果大小为0,可以使用空指针调用memset()吗?

出于这样或那样的原因,我想手动滚动归零版本malloc().为了最大限度地减少算法的复杂性,我想写:

void * my_calloc(size_t size)
{
    return memset(malloc(size), 0, size);
}
Run Code Online (Sandbox Code Playgroud)

这个定义明确size == 0吗?可以malloc()使用零大小调用,但这允许它返回空指针.请问后续调用memset是否正常,或者这是未定义的行为,我需要添加一个条件if (size)

我非常想避免多余的条件检查!

假设malloc()暂时没有失败.实际上那里也会有一个手动滚动版本malloc(),它会在失败时终止.

像这样的东西:

void * my_malloc(size_t size)
{
    void * const p = malloc(size);
    if (p || 0 == size) return p;
    terminate();
}
Run Code Online (Sandbox Code Playgroud)

c malloc memset

15
推荐指数
3
解决办法
8036
查看次数

如何用空终止字符memset char数组?

使用null终止字符memset整个字符数组的正确和最安全的方法是什么?我可以列出一些用法:

...
char* buffer = new char [ARRAY_LENGTH];

//Option 1:             memset( buffer, '\0', sizeof(buffer) );
//Option 2 before edit: memset( buffer, '\0', sizeof(char*) * ARRAY_LENGTH );
//Option 2 after edit:  memset( buffer, '\0', sizeof(char) * ARRAY_LENGTH );
//Option 3:             memset( buffer, '\0', ARRAY_LENGTH );
...
Run Code Online (Sandbox Code Playgroud)
  • 这些中的任何一个都有明显的优势吗?
  • 使用1,2或3可以面对哪些问题?
  • 处理此请求的最佳方法是什么?

c++ arrays memset null-terminated c++11

15
推荐指数
3
解决办法
7万
查看次数

是否存在以相反顺序填充缓冲区的memset函数实现?

我知道有一些实现memcpy,它们以相反的顺序复制内存以优化某些处理器.曾经有一个错误" mp3 flash网站上的奇怪声音 "与之相关.嗯,这是一个有趣的故事,但我的问题是另一个功能.

我想知道,memset世界上有一个函数,从最后开始填充缓冲区.很明显,理论上没有什么能阻止这样的函数实现.但我完全感兴趣的是,这个功能是在某个地方某人的实践中完成的.我将特别感谢库中具有这种功能的链接.

PS我明白,就应用程序编程而言,缓冲区是按升序还是降序填充完全没有区别.但是,重要的是要找出是否存在任何"反向"功能实现.我需要它写一篇文章.

c c++ memset

14
推荐指数
1
解决办法
705
查看次数

标签 统计

memset ×10

c ×7

arrays ×3

c++ ×3

c++11 ×1

design-patterns ×1

go ×1

malloc ×1

memcpy ×1

memory ×1

null-terminated ×1

slice ×1

sockets ×1

volatile ×1