在运行时调整char[]大小

4
我需要在运行时将char array[size]调整为char array[new_size]的大小。
我该如何做到这一点?

1
你想要调整一个静态分配的 char[] 的大小吗? - Mehrdad Afshari
@Mehrdad:他并不是这样做,只是将数组大小可视化了一下;) - Cecil Has a Name
@HoNgOuRu:你能给我们展示一些你的代码吗? - quamrana
6个回答

17

如果您使用的是std::vector<char>而不是数组,则您想要的功能将成为该类型的另一种方法。


6
假设已经使用malloc分配了char array[size],你可以使用realloc。以下是一个例子(摘自OpenBSD的手册页):
newsize = size + 50;
if ((newp = realloc(p, newsize)) == NULL) {
   free(p);
   p = NULL;
   size = 0;
   return (NULL);
}
p = newp;
size = newsize;

@GMan:这非常标准,甚至是惯用的。我的意思是,std::vector或类似的东西都可以做到这一点,你只需要不去看它,如果手动编码,最好也将其封装起来。 - dmckee --- ex-moderator kitten
2
当然可以。在向量中更抽象。向量调用分配器,分配器可以执行任何需要的操作。 - GManNickG
1
虽然在C++中可以使用malloc来分配内存,但这并不是C++中标准的内存分配方式。如果提问者询问的是关于C语言的问题,那么这个回答是正确的,但是提问者正在询问关于C++的问题。 - Martin York
是的,应该使用像vector这样的STL容器,但那不是他问的内容。请阅读他帖子中的问题。 - Los

2

您需要分配一个新的数组并将现有数组的内容复制到其中。不能仅仅使现有数组变大。


我必须在类头中声明char数组[],但我需要根据一个单词的长度构建它,我正在做挂起游戏... - HoNgOuRu
@HoNgOuRu:在你的问题中加入这个 - 这很重要。 - MSalters

2
删除旧数组(如果有的话),然后分配一个新数组:
char* array = (char*)malloc(sizeof(char) * number_of_chars_in_word);

感谢所有的回答,但我的问题是我不能改变数组名称,因为它在对象中被定义,我必须用一个大小来定义它,但在加载单词之前我没有一个大小,而这发生在构造函数中。 在类定义中,我有,string palabra; char palocu[size_of_palabra]; (但此时我没有size_of_palabra,因为它将在构造函数中加载,这就是我的问题...我需要这个因为我必须从主类中的后期访问“palocu”...) - HoNgOuRu
2
就像我们一直在说的那样,使用std::vector - GManNickG
@HoNgOuRu: иҜ·з»ҷжҲ‘们еұ•зӨәд»Јз ҒгҖӮжӮЁеҸҜиғҪеҸҜд»ҘдҪҝз”ЁеңЁжһ„йҖ еҮҪж•°дёӯnewпјҢеңЁжһҗжһ„еҮҪж•°дёӯdeleteзҡ„char* palocuжҲҗе‘ҳгҖӮдҪҶжҳҜдҪҝз”Ёstd::vectorеҸҜиғҪдјҡжӣҙеҘҪгҖӮ - quamrana

2

类似这样的:

class HangUpGame {
    char *palabra;
    size_t palabra_size;

    public:
        HangUpGame(){
            palabra = new char[DEFAULT_SIZE];
            palabra_size = DEFAULT_SIZE;
        }
        virtual ~HangUpGame(){
            delete [] palabra;
        }

        void Resize(size_t newSize){
            //Allocate new array and copy in data
            char *newArray = new char[newSize];
            memcpy(newArray, palabra, palabra_size);

            //Delete old array
            delete [] palabra;

            //Swap pointers and new size
            palabra = newArray;
            palabra_size = newSize;
        }
};

针对其他答案的评论,实际上最好的方法是使用STL容器。但是,如果您更喜欢使用数组,那么将当前数组与一个更大的数组进行交换非常容易(在内部,STL容器也会做同样的事情)。


2
能否改进您的答案,使之能够实际编译通过呢? - quamrana
好的,之前的版本确实编译过了...取决于你写在哪里。无论如何,新代码可以成功编译并应该能正常工作。 - LorenzCK
1
这段代码有几个重大的错误,请查找浅拷贝问题。请阅读以下内容进行更正:https://dev59.com/BnVC5IYBdhLWcg3wjx5d#255744 - Martin York

0

好的,感谢所有的回答,我通过指针为新的字符数组创建了一个新的空间来解决我的问题...谢谢


5
不,不,不。使用 std::vector。否则为什么要这样做?你正在重新发明轮子,并且很可能会有 bug。 - GManNickG
1
@GMan:是的,而且可能会泄漏内存。 - quamrana
@GMan,@quamrana:使用像vector这样的STD容器是理想的,除非他的数据结构通过库暴露(即... C程序需要使用它)。仅仅因为他正在使用char指针数组并不意味着它会泄漏内存(只要考虑到所有情况)。@Cecil Has a Name:这最好不是一些孩子的高中作业。 ;) - Los

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接