不同大小的预期malloc功能

时间:2013-03-13 15:57:18

标签: c++ size malloc

解决方案可能很简单但我在cpp中并不生动。

执行代码后,function strlen((char*)buffer)的值高于我的假设。这是为什么?我该如何解决? (if filesize=48, than strlen((char*)buffer)=64,也应该是48!)

    ifstream iffile;
    iffile.open(argv[1], ios::in | ios::binary | ios::ate);
    if (iffile.is_open())
    {
       long filesize = iffile.tellg();
       if (filesize > 0)
       {
           iffile.seekg(0, ios::beg);
           {
                 long pos = iffile.tellg();
                 if (pos != filesize)
                 {
                       char *buffer;
                       buffer = (char *)malloc(filesize * sizeof * buffer);
                       if (buffer != NULL)
                       {
                             memset(buffer, 0, filesize - pos);
                             iffile.read((char *)buffer, filesize);

此外,我必须提到在我的文件中有很多不可打印的值。

2 个答案:

答案 0 :(得分:2)

您的代码假定该文件包含终止'\0'字符,以将字符数组转换为字符串。这个终结符是strlen()查找的内容,所以如果不存在,则必须添加它。

可以肯定的一种方法是malloc()(顺便说一句,应该是new[]或C ++中比较漂亮的东西)比file_size多一个字符,并将其设置为{{ 1}}加载后。

此外,您必须检查分配和I / O是否成功。

答案 1 :(得分:1)

永远不要在C ++中使用malloc;这是一个C-ism。

选项1

改为使用new;

buffer = new char[filesize]

完成后,必须使用delete[]解除分配内存。

选项2

你也不应该在C ++中使用原始指针(好吧,如果你知道自己在做什么并且感觉100%,喝一杯好咖啡并且通常很勇敢,你就可以。)

在这种情况下,我想我会使用std::vector<char>

std::vector<char> buffer(filesize);
iffile.read(&buffer.front(), filesize);

这样,std库可以为您管理内存。