可能重复:
是否有memset()接受大于char的整数?
正如在memset的声明中可以看到的那样:
void * memset ( void * ptr, int value, size_t num );
Run Code Online (Sandbox Code Playgroud)
有没有办法使用这个memset函数(或STL库中包含的其他函数),以便您可以将内存设置为long long类型值?
我用它来初始化一个具有较大值的long long数组.
我必须说,我通过简单地迭代数组的每个值并将其设置为所需的值来"解决"这个问题.
我一直在使用恩智浦LPC11XX设备和FreeRTOS上的项目.问题是,这个演示项目使用了一些基于Eclipse的IDE,我不会有任何这个.我把它转换为在linux中编译,我可以编程没有任何问题.我看到的问题是当演示项目到达memset()时,CPU中会产生硬故障.这不是我的代码,但我觉得这与我所做的事情有关.我正在使用代码源"gcc版本4.4.1(Sourcery G ++ Lite 2010q1-188)"编译器(我在Cortex-M3设备上使用时没有问题).我看到在一个该死的"lsls"指令上生成的硬错误,它在内存中没有任何内容,看到这个GDB输出的大量粘贴器:http://pastebin.com/3pg0puSe(我不知道这里的大块通用做法是什么这样的文字.)
任何想法,任何人?谢谢您的帮助!
如果我有
void *temp = malloc(128);
memset(temp, 0 , 128);
Run Code Online (Sandbox Code Playgroud)
我想单独读取第一个字节,这是我在做什么。
char a[2];
strncpy(a, (char*)temp, 1);
int p = a[0];
//p will be zero in this case
Run Code Online (Sandbox Code Playgroud)
Q1。我敢肯定,有一种更优雅的方法可以达到相同目的。如果是这样,那会是什么?
Q2。有没有办法我可以单独更改单个字节的值?
假设我希望第一个字节的值等于int值48(即00110000),我该怎么做?我写的没有任何进展。
所以我在这里有一个 2D 向量,我想为其分配一个值 num,我想看看作为 C++ 菜鸟的填充与 memset() 哪个更好,我实际上在设置正确的代码语法时遇到了问题,因为我总是在以下情况下遇到分段错误我做。
vector<vector<int>> matrix(10, vector<int>(10000000));
int main()
{
int num;
cin >> num;
int i = 0;
for (auto &i : matrix)
{
fill(i.begin(), i.end(), num);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我创建了一个布尔二维数组并memset像这样使用:
bool chk[3][3];
memset(chk, 1, 9*sizeof(chk[0]));
Run Code Online (Sandbox Code Playgroud)
我使用以下代码块得到了预期的输出(每行都有 1 )
for(int i = 0 ; i < 3; i++){
for(int j = 0; j < 3; j++)
cout<<chk[i][j] <<" ";
cout<<endl;
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试操作数组时,我得到了意想不到的结果
然后我尝试了
memset(chk, 1, 9*sizeof(chk[0][0]));
Run Code Online (Sandbox Code Playgroud)
这次一切都很好并得到了我预期的结果(操作后)
您能帮我指出 memset() 中到底发生了什么吗?
是否有相应的memset std::array?我认为memset在将数组初始化为零而不是循环遍历数组时应该表现得更好.我搜索了一个,std::array但在网上找不到任何东西.
我试图弄清楚为什么当我从函数内部调用memset时不起作用。当然,我可以使用for循环来重置所有值,但是我在这里学习,这件事使我没有任何解释。
/* First source code */
#include <stdio.h>
#include <string.h>
int main(void) {
int i, j, num;
printf("Digit a number :");
scanf("%d", &num);
int magic[num][num];
printf("First\n");
for(i = 0; i < num; ++i) {
for(j = 0; j < num; ++j) {
printf("%4d", magic[i][j]);
}
printf("\n\n");
}
memset(magic, 0, sizeof(magic));
printf("Before\n");
for(i = 0; i < num; ++i) {
for(j = 0; j < num; ++j) {
printf("%4d", magic[i][j]);
}
printf("\n\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
/* Second source code */ …Run Code Online (Sandbox Code Playgroud) 我正在用的dynamic_cast这个奇怪的运行时异常,但只有当我填的是我与使用零铸造的对象memset,或者只是一些数据复制到它memcpy。这是生成异常的示例。
class Base
{
public:
virtual void func() { }
};
class Derived : public Base
{
public:
void func() override { }
};
int main()
{
Derived derived;
Base* base_ptr = &derived;
memset(base_ptr, 0, sizeof(Derived));
Derived* derived_ptr = dynamic_cast<Derived*>(base_ptr);
}
Run Code Online (Sandbox Code Playgroud)
如果我Derived使用 memcpy将一个对象复制到另一个对象,我会得到相同的异常。任何人都知道发生了什么,是否弄乱了dynamic_cast使用的 RTTI ?
我正在制作一个游戏引擎,它是一个实体组件系统,在程序中的某个时刻,我从一个文件中加载了所有对象及其组件。我实现不同组件的方式是使用继承(每个组件都源自一个基本组件)。当我加载对象及其组件时,我不能只分配组件占用的内存量,我必须使用新的组件名称,因为只有这样 dynamic_cast 才能工作。
我正在使用 Visual Studio 2019。
可以使用哪些类别的算法punpcklbw?
特别是,在punpcklbw xmm0, xmm0做什么?
然而,什么是maskedPow2_Value有用的?
maskedValue = 0x101010101010101i64 * *(_QWORD *)&Val; // Val 是 int maskedPow2_Value = 0x101010101010101i64 * maskedValue;
(或mov r9, 101010101010101h; imul rdx, r9;两次)
一个完整的例子(该函数名为 CompressPacket 但它可能会产生误导),作为 IDA 反编译的结果:
void *__cdecl CompressPacket(void *Dst, int Val, size_t Size)
{
__int64 maskedPow2_Value; // rdx
unsigned int v5; // ecx
__int64 *bufferOut; // rcx
size_t size_; // r9
size_t i; // r9
size_t size__; // r9
size_t counter; // r8
size_t j; // …Run Code Online (Sandbox Code Playgroud) 我正在尝试测量内存的写入带宽,我创建了一个 8G 字符数组,并使用 128 个线程在其上调用 memset。下面是代码片段。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <pthread.h>
int64_t char_num = 8000000000;
int threads = 128;
int res_num = 62500000;
uint8_t* arr;
static inline double timespec_to_sec(struct timespec t)
{
return t.tv_sec * 1.0 + t.tv_nsec / 1000000000.0;
}
void* multithread_memset(void* val) {
int thread_id = *(int*)val;
memset(arr + (res_num * thread_id), 1, res_num);
return NULL;
}
void start_parallel()
{
int* thread_id = malloc(sizeof(int) * threads);
for (int i = 0; i < …Run Code Online (Sandbox Code Playgroud) memset ×10
c++ ×6
c ×3
2d-vector ×1
arm ×1
arrays ×1
assembly ×1
c++11 ×1
c99 ×1
compression ×1
disassembly ×1
dynamic-cast ×1
fill ×1
function ×1
inheritance ×1
malloc ×1
memcpy ×1
memory ×1
sse ×1
stdarray ×1