使用malloc保留连续块

Wha*_*tIf 0 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);
}
Run Code Online (Sandbox Code Playgroud)

程序的输出显示所有地址相隔8个字节.它们不应该只相隔一个字节吗?有没有办法让我知道char我的架构上是否消耗了8个字节?

小智 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::cerr,以及std::ostream类来处理.你需要做的事情static_cast<void *>(p + i)而不是p + i你在C中使用的事情.

正如其他人所指出的,你应该避免使用malloc(),并free()在C++中可能的情况下,C++拥有new[]delete[]经营你的目的.

  • 真正发生的事情的好解释. (2认同)