使用malloc保留连续块

时间:2015-07-18 19:51:06

标签: c++ malloc

我正在尝试了解有关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个字节?

6 个答案:

答案 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::coutstd::cerrstd::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