每当我在书籍,手册页和网站中查看真实代码或示例套接字代码时,我几乎总会看到类似下面的内容:
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++中,我可以使用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模拟(将数组初始化为某些非零值的快速方法)?
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时,我得到一个堆栈转储.这不是初始化结构数组的正确方法吗?
我现在正在研究memset函数,但所有示例都与char数组有关,如下所示:
char a[100];
memset(a, 0, 100);
Run Code Online (Sandbox Code Playgroud)
它会将此char数组中的每个元素设置为0.
我想知道memset是否可以应用于int数组或float数组?
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数组的所有元素?
我今天面临一个问题,我需要将内存更改为某种模式,如0x 11223344,以便整个内存看起来像(十六进制):
1122334411223344112233441122334411223344112233441122334411223344...
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何使用memset(),因为它只需要一个字节,而不是4个字节.
有任何想法吗?
谢谢,Boda Cydo.
出于这样或那样的原因,我想手动滚动归零版本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)
使用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)
我知道有一些实现memcpy,它们以相反的顺序复制内存以优化某些处理器.曾经有一个错误" mp3 flash网站上的奇怪声音 "与之相关.嗯,这是一个有趣的故事,但我的问题是另一个功能.
我想知道,memset世界上有一个函数,从最后开始填充缓冲区.很明显,理论上没有什么能阻止这样的函数实现.但我完全感兴趣的是,这个功能是在某个地方某人的实践中完成的.我将特别感谢库中具有这种功能的链接.
PS我明白,就应用程序编程而言,缓冲区是按升序还是降序填充完全没有区别.但是,重要的是要找出是否存在任何"反向"功能实现.我需要它写一篇文章.