我正在尝试了解有关malloc()
的更多信息,并需要帮助澄清输出。我想保留10个字节的内存并能够单独访问它们,但它们必须在一个块中。这是代码:
#include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
int main()
{
char neededbytes = 10;
char *p;
p = (char *)malloc(neededbytes * sizeof(char));
if(p==NULL)
{
cout<<"Error! memory not allocated.";
exit(0);
}
else
{
for (int i = 0; i < neededbytes; i++)
{
p[i] = 0;
}
for (int i = 0; i < neededbytes; i++)
{
cout<<"Address at index " << i << " is ";
cout<<&p+i<<endl;
}
}
free(p);
}
程序输出显示所有地址相隔8个字节。它们不应该只相隔一个字节吗?有没有办法让我知道char
在我的架构上消耗8个字节?
答案 0 :(得分:6)
&p+i
与(&p)+(i)
相同,由于p
的类型为char*
,&p
的类型为char**
。因此,添加i
实际上会将i * sizeof(char *)
字节添加到&p
表示的地址。
您想要的是p + i
,它会将i * sizeof(char)
个字节添加到p
中存储的地址中。换句话说,当您使用malloc()
时,您已经有一个指向连续数据的指针。当然,这是C ++,因此char *
专门由std::cout
,std::cerr
和std::ostream
类处理。您需要执行static_cast<void *>(p + i)
之类的操作,而不仅仅是{C}中使用的p + i
。
正如其他人所说,你应该尽可能避免在C ++中使用malloc()
和free()
; C ++有new[]
和delete[]
运算符用于您的目的。
答案 1 :(得分:2)
cout<<&p+i<<endl;
应为cout<<static_cast<void*>(p+i)<<endl;
答案 2 :(得分:1)
因为您正在使用运算符的地址,所以在这种情况下,偏移量将为i * sizeof(char *)
,在您的系统上显然是8 * i
字节。
试试这个
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{
char neededbytes = 10;
char *p;
p = static_cast<char *>(malloc(neededbytes));
if (p == NULL)
{
cout << "Error! memory not allocated.";
exit(-1);
}
for (int i = 0; i < neededbytes; i++)
p[i] = 0;
for (int i = 0; i < neededbytes; i++)
{
cout << "Address at index " << i << " is ";
cout << static_cast<void *>(p + i) << endl;
}
free(p);
}
答案 3 :(得分:0)
您可以在编译器输出设置中查看char的字节对齐方式,但我认为char总是1个字节。尝试这样的一些更改(我认为你在&p+i
访问了错误的数组元素):
int main()
{
int neededbytes = 10;
char *p=NULL;
p = malloc(neededbytes * sizeof(char));
if(p==NULL)
{
cout<<"Error! memory not allocated.";
exit(0);
}
else
{
for (int i = 0; i < neededbytes; i++)
{
p[i] = 0;
}
for (int i = 0; i < neededbytes; i++)
{
cout<<"Address at index " << i << " is ";
// Dave cout<<p+i<<endl;
cout<<&(p+i)<<endl;
}
}
free(p);
}
注意:Dave分享了p+i
的正确语法。谢谢戴夫
答案 4 :(得分:0)
将cout<<&p+i<<endl;
更改为cout<<static_cast<void*>(p+i)<<endl;
。
答案 5 :(得分:-3)
这是一个讨论GNU系统内存对齐的网站。它将始终为8(64位系统为16)字节对齐。有一些libc(stdlib.h)函数可以强制你在那里列出对齐。
http://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html