为什么C ++在内存中为动态数组分配如此大的空间?

时间:2013-10-04 12:01:47

标签: c++ arrays

在我尝试将其初始化为char数组之前,

readFruit.name被初始化为NULL。我包括size以确定这是否是罪魁祸首,但根据我的输入,它应该是它应该是什么。无论tempString的长度是多少,readFruit.name在内存中分配大约25个“字符”,它们都是垃圾。为什么不分配tempString.length()大小的空间以及如何解决它?

相关CPP

std::istream & operator>>(std::istream &is, Fruit &readFruit)
{

string tempString;
is >> tempString;
int size = tempString.length();
readFruit.name = new char[tempString.length()];
for(int i = 0; i < (int)tempString.length(); i++)
{
    readFruit.name[i] = tempString[i];
}
for(int i =0; i < CODE_LEN; i++)
{
    is >> readFruit.code[i];
}
return is;
}

相关H文件(构造函数)

#ifndef _FRUIT_H
#define _FRUIT_H
#include <cstring>
#include <sstream>
#include <iomanip>
#include <iostream>
enum { CODE_LEN = 4 }; 
enum { MAX_NAME_LEN = 30 };
class Fruit
{
private:
    char *name;
    char code[CODE_LEN];
public:
    Fruit(const Fruit &temp);
    Fruit(){name = NULL;};
    bool operator<(const Fruit& tempFruit);
    friend std::ostream & operator<<(std::ostream &os, const Fruit& printFruit);
    bool operator==(const Fruit& other){return *name == *other.name;};
    bool operator!=(const Fruit& other){return *name != *other.name;};
    friend std::istream & operator>>(std::istream& is, Fruit& readFruit);
};
#endif

2 个答案:

答案 0 :(得分:4)

如果你正在尝试打印readFruit.name,它会显示垃圾值,直到找到空终止,这就是我假设你说的25个字符&#34; 所有垃圾&#34;

分配内存如下:

readFruit.name = new char[tempString.length()+1];

for循环后执行:

readFruit.name[i] ='\0'; // C strings are null terminated

答案 1 :(得分:3)

要解决您的问题,您需要空终止name字符数组。现在你复制了所有字符,但是你需要在结尾处使用二进制零字符才能使所有字符串函数都能正常工作。所以你需要多分配一个char并写一个'\0'

那就是:用std::string代表水果的名字。没有理由通过使用角色阵列来帮助自己解决大量的自制错误。