2011-10-18 167 views
1

我曾在此发布过一个问题,但我想用memcmp()函数代替。 Writing data to memory in C++在C++中将数据写入内存

int x = 1; 
int fileptr = 0; 
void *data = malloc(4096); 
memcpy((int *)data+fileptr, &x, sizeof(int)); 

然后我读出的值回

int y; 
fileptr = 0; 
memcpy(&y, (int *)data+fileptr, sizeof(int)); 
cout<<y; 

以这种方式,我获得变量y不同的输出(一些长的整数值)。请立即帮助。

+2

欢迎使用堆栈溢出!确切地说,你的问题是什么? –

+0

这里我没有看到'memcmp'的使用。如果你解释了什么问题导致你使用这个解决方案*,我相信人们可以帮助你找到更好的解决方案,而不需要微观管理指针,并且随时都会遇到未定义的行为。 –

+0

你没有初始化'data'。您正在写入随机存储器地址。 –

回答

4

您声明了一个指针data但是从不初始化它。所以行为是不确定的。你必须在某处指向data,即分配内存。见here

+0

我已经在代码中初始化它。 data = malloc(4096); – Akshay

+0

@Akshay:在这种情况下,你正在做一些非常错误的事情。再次看到你的程序,然后编译并再次运行它! – Nawaz

+0

数据类型转换是否存在问题? 由于字符正确显示,但不是整数。 由于int是4个字节,我认为sumthing可能是错误 – Akshay

0

除非您遗漏了一些代码,否则data从不初始化,因此指向一些随机位置。由于您的应用程序没有完全崩溃,因此您可能会(有点)幸运,并且最终以data指向堆栈中由其他代码写入的位置;因此价值的变化。

分配一些内存data写入它之前,这不会发生。

0

你还没有分配任何数据存储 - 所以当你复制整型数据时,你不会因为破坏堆栈而导致问题的结束。

你可能想要做这样的事情

int x = 1; 
void *data=new int(); 
memcpy(data, &x, sizeof(x)); // never use the type use the var - more resilient to change 
+0

这里的问题是数据类型是无效的,我必须存储int,char,reals的组合。 所以我不能使用data = new int(); – Akshay

0

这实际上调用未定义的行为,因为你没有为data分配的内存。那么它应该在哪里存储x的位模式呢?

如果你已经分配了内存(使用malloc),仍然得到错误的输出,那么在这种情况下,你正在做一些非常错误的事情。再次看到你的程序,然后编译并再次运行它。因为输出不能是除1以外的其他任何内容。看到这一点:

通过字与我的比你的程序(在上面的链接)的话,看看是否有什么事情你失踪。

+1

非常感谢...我取消了不需要的代码并且运行良好 – Akshay

+0

@Akshay:看到我告诉过你,有些事情你做错了。现在看看你在干什么影响输出的不需要的代码。 – Nawaz