我有一个结构
typedef struct my_s {
int x;
...
} my_T;
my_t * p_my_t;
Run Code Online (Sandbox Code Playgroud)
我想设置的地址p_my_t到NULL,到目前为止这是怎么了,我试着这样做:
memset (&p_my_t, 0, sizeof(my_t*))
Run Code Online (Sandbox Code Playgroud)
不过,这对我来说并不合适.这样做的正确方法是什么?
问题修正案 - 提出一个更复杂的问题:
这是我想要做的:
注意:没有标准的方法来通过进程之间的共享内存来管理内存分配.你将不得不做一些相当仔细的思考发生了什么.
为什么发布版本memset比visual studio 2012中的调试版本慢?在视觉sutido 2010中,也是这样的结果.我的电脑:
英特尔酷睿i7-3770 3.40GHz 8G内存操作系统:windows 7 sp1 64bit
这是我的测试代码:
#include <boost/progress.hpp>
int main()
{
const int Size = 1000*1024*1024;
char* Data = (char*)malloc(Size);
#ifdef _DEBUG
printf_s("debug\n");
#else
printf_s("release\n");
#endif
boost::progress_timer timer;
memset(Data, 0, Size);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
release
0.27 s
debug
0.06 s
Run Code Online (Sandbox Code Playgroud)
编辑:
if i change code to this, it will get the same result:
#include <boost/progress.hpp>
int main()
{
const int Size = 1000*1024*1024;
char* Data = (char*)malloc(Size);
memset(Data, 1, Size);
#ifdef _DEBUG
printf_s("debug\n");
#else …Run Code Online (Sandbox Code Playgroud) 为什么在调用delete this;以下函数后调用堆栈?
msvcr110d.dll!_VEC_memset(void * dst, int val, int len)
Run Code Online (Sandbox Code Playgroud)
请考虑operator delete没有超载.
我发现这段使用memset()初始化对象的C++代码:
struct Message
{
Message()
{
memset(this, 0, sizeof(Message));
}
unsigned int a, b, c;
};
Run Code Online (Sandbox Code Playgroud)
由于这是一个POD结构,这个代码应该没问题.
使用memset而不是构造函数是否有任何优势,例如:
Message() : a(0), b(0), c(0) {}
Run Code Online (Sandbox Code Playgroud) 我已经用值 1 初始化了整个数组,但输出显示了一些垃圾值。但是,如果我使用 0 或 -1 代替 1,该程序可以正常工作。那么,对于可以使用 memset 初始化的值类型是否有一些限制。
int main(){
int a[100];
memset(a,1,sizeof(a));
cout<<a[5]<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用memset以下方法单独设置无符号短变量中的字节:
#include <cstring>
#include <iostream>
int main()
{
unsigned short test2; // 2 bytes
std::cout << "size of test2: " << sizeof(test2) << std::endl;
memset(&test2, 0, 2);
memset(&test2, 0x4D, 1);
memset(&test2+1, 0x42, 1);
std::cout << "value: " << test2 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
size of test2: 2
value: 77
Run Code Online (Sandbox Code Playgroud)
77是0x4D.所以由于某种原因,它没有拿起我试图在变量的第二个字节上设置的0x42.这是为什么?
我使用系统调用编写了简单的c程序,当我用gcc编译它时它工作得很好。但是当我尝试使用命令生成 shell 代码 (shellforge) 时
./sf.py username.c
Run Code Online (Sandbox Code Playgroud)
我收到错误说明
Undefined reference to memset
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?这是我的代码
#define O_CREAT 0100
#define O_WRONLY 01
#define O_APPEND 02000
#define IDLEN 100
int main(void)
{
char user_name[IDLEN]="";
char pass1[IDLEN]="";
char pass2[IDLEN]="";
int fd,a,b,c;
//to give user direction
char user[]="Please type your username and hit enter:\n";
char p1[]="Please type password and hit enter:\n";
char p2[]="Please type password and hit enter:\n";
write(1,user,sizeof(user));
a=read(0,user_name,IDLEN);
user_name[a-1]='\0';
while(1)
{
write(1,p1,sizeof(p1));
b=read(0,pass1,IDLEN);
pass1[b-1]='\0';
write(1,p2,sizeof(p2));
c=read(0,pass2,IDLEN);
pass2[c-1]='\0';
int temp=0;
while(pass1[temp] == pass2[temp])
{
if(pass1[temp] …Run Code Online (Sandbox Code Playgroud) 我的代码适用于Windows,但现在我使用Xcode 3.2.5 C/C++编译器版本GCC 4.2移植到MAC,它崩溃了.
我把它缩小到了一个memset电话.如果我注释掉memset它的工作原理,如果我把它放回代码崩溃.
我的头文件中有一个看起来像这样的结构:
typedef struct
{
int deviceCount;
struct
{
#define MAX_DEVICE_ID 256
#define MAX_DEVICE_ENTRIES 10
std::string deviceId; // Device name to Open
TransportType eTransportType;
} deviceNodes[MAX_DEVICE_ENTRIES];
} DeviceParams;
Run Code Online (Sandbox Code Playgroud)
然后在cpp文件中我有这个:
DeviceParams Param;
memset(&Param, nil, sizeof(Param));
Run Code Online (Sandbox Code Playgroud)
......后来我有这个:
pParam->deviceNodes[index].deviceId = "some string"; // <----- Line that crashes with memset
Run Code Online (Sandbox Code Playgroud)
就像我之前说的,如果我删除memset调用一切正常.如果我在调用memset之前查看调试器,我的结构中的字符串是\ 0,而在memset之后它们是nil.
为什么nil字符串在赋值行上崩溃而且只在MAC上崩溃?
谢谢.
普通的C,在Windows 7和HP机器上.
int main(void) {
unsigned int a = 4294967295;
unsigned int *b = &a;
printf("before val: '%u'\n", *b); // expect 4294967295, got 4294967295
memset(b+2, 0, 1);
printf("after val: '%u'\n", *b);
// little endian 4th 3rd 2nd 1st
// expect 4278255615 - 11111111 00000000 11111111 11111111
// got 4294967295 - 11111111 11111111 11111111 11111111
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想将整数的第三个字节设置为0x0,但保持不变.有任何想法吗?谢谢.
在我的机器上,int是32位.
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int color[1001][1001];
int main() {
int i, j;
memset(color, 1, sizeof(color[0][0]) * 2 * 2);
for(i = 0; i < 4; i++) {
for(j = 0; j < 4; j++) {
printf("%d ", color[i][j]);
}
printf("\n");
}
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
16843009 16843009 16843009 16843009
0 0 0 0
0 0 0 0
0 0 0 0
Run Code Online (Sandbox Code Playgroud)
为什么不分配1?为什么不打印1而不是16843009?如何分配整数1?
但如果我写memset(color, 0, sizeof(color[0][0]) * 2 * 2);然后输出:
0 …Run Code Online (Sandbox Code Playgroud) memset ×10
c++ ×8
c ×3
arrays ×1
constructor ×1
crash ×1
null ×1
pointers ×1
shellforge ×1
string ×1
system-calls ×1
unix ×1
xcode ×1