请问:我有 DNotelListNode * dnot[4] ,我想把这个4 变成一个可以在程序中重新变成设定的大小,如变成dnot[16],怎么办呀

时间:2022-11-22 22:23:07
请问:我有 DNotelListNode * dnot[4] ,我想把这个4 变成一个可以在程序中重新变成设定的大小,如变成dnot[16],怎么办呀 ,谢谢

6 个解决方案

#1


用CArray<TYPE,TYPE>数组来实现。

#2


没办法做到,因为C/C++都是静态特性非常强的语言,dnot[4]这个一般是在编译期就确定好的,没办法改变(C99里面引入了VLA,但是仍然不能解决你的问题,因为VLA在第一次定下长度以后不能再被改变)。

如果你使用的是DNotelListNode **dnot的话,倒是可以使用realloc来重新分配大小(但是要求你分配dnot指向的空间的时候使用的是C风格的空间分配函数malloc等)。不过这个不算什么苛刻的要求,对于指针来说不需要调用额外的构造函数来进行初始化,所以不要紧……

如果这个方法你不能接受,就只能靠C++标准库里面提供的容器或者MFC里面的容器了(一般来说,这些容器虽然用起来方便,但是有不少额外的开销……)

#3


用指针,malloc ,realloc 就能实现动态分配了

先用malloc  分配内存
再用realloc 改变已经分配的内存大小。 

原理:
1.判断原内存之后一直到再有数据的空闲内存
2.如果新分配的内存小于 如上 现有的空闲,则直接改变原内存大小
否则:将在一块新的堆内存中分配总共的内存大小,再用memcpy将原数据复制过去。(由于内存复制速度非常快,所以根本感觉不出来)

#4


dnot=(DNotelListNode **)malloc(4 * sizeof(DNotelListNode * ));
怎么是错的呀,我要怎么写呀,急呀

#5


好像没有问题么……

编译器报告什么错误?

#6


你不会还是沿用了以前的定义吧?

DNotelListNode *dnot[4]这个定义也要跟着修改的……

改成这样:
DNotelListNode **dnot;//这里要改
dnot = (DNotelListNode**)malloc(4 * sizeof(DNotelListNode*));

#1


用CArray<TYPE,TYPE>数组来实现。

#2


没办法做到,因为C/C++都是静态特性非常强的语言,dnot[4]这个一般是在编译期就确定好的,没办法改变(C99里面引入了VLA,但是仍然不能解决你的问题,因为VLA在第一次定下长度以后不能再被改变)。

如果你使用的是DNotelListNode **dnot的话,倒是可以使用realloc来重新分配大小(但是要求你分配dnot指向的空间的时候使用的是C风格的空间分配函数malloc等)。不过这个不算什么苛刻的要求,对于指针来说不需要调用额外的构造函数来进行初始化,所以不要紧……

如果这个方法你不能接受,就只能靠C++标准库里面提供的容器或者MFC里面的容器了(一般来说,这些容器虽然用起来方便,但是有不少额外的开销……)

#3


用指针,malloc ,realloc 就能实现动态分配了

先用malloc  分配内存
再用realloc 改变已经分配的内存大小。 

原理:
1.判断原内存之后一直到再有数据的空闲内存
2.如果新分配的内存小于 如上 现有的空闲,则直接改变原内存大小
否则:将在一块新的堆内存中分配总共的内存大小,再用memcpy将原数据复制过去。(由于内存复制速度非常快,所以根本感觉不出来)

#4


dnot=(DNotelListNode **)malloc(4 * sizeof(DNotelListNode * ));
怎么是错的呀,我要怎么写呀,急呀

#5


好像没有问题么……

编译器报告什么错误?

#6


你不会还是沿用了以前的定义吧?

DNotelListNode *dnot[4]这个定义也要跟着修改的……

改成这样:
DNotelListNode **dnot;//这里要改
dnot = (DNotelListNode**)malloc(4 * sizeof(DNotelListNode*));