84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
在头文件定义的某结构中包含Obj *p这个属性 但是这个属性在实现中其实是malloc了一个指针数组,但是如果头文件里没有注释说明这个*p是一个指针数组,是不是不看代码就没法知道Obj *p其实是数组了?
看了一些代码头文件中明明是Obj *p,使用的时候却p[i]这样用,翻了cpp文件才发现原来是malloc数组了, 这样的代码的歧义也太大了,难道大家一直都这么用的?难道C++这个平行世界这么神奇?
认证高级PHP讲师
Obj *p; p只是一个指向Obj结构或类型的指针。 malloc向系统申请一块内存,成功的话就返回一个地址,在楼主看的代码里应该把这个地址赋给p了。 由于声明的是Obj指针类型,编译器就将这块内存里的内容解释为Obj结构或类型的一个实例(或者说变量)。 p[i]会被编译器翻译成*(p+i), 由于p是Obj类型的,这个表达式表示的就是从p 开始,第i个Obj对象。
我也想说说自己的看法,首先我不知道这个结构会是多大,如果很小的话,要表达结构中包含这个实例变量,我会这样定义一个结构 struct SomeData { ... Obj _obj; }; 如果结构要包含的是一个元素类型为Obj的数组,但是数组元素个数未可知,那我当然是像使用问题中的指针存放动态数组的首元素地址的方法了。 struct SomeData { ...
}; ----------------------- 不过,我不明白C++中为什么要用指针表示未知数组呢,何不用vector呢 --------------------------- 题主有注意过结构的构造函数和析构函数吗? 我猜测应该是这样的: SomeData::SomeData() { _pObj = (Obj*)malloc(sizeof(Obj)*someInt); } SomeData::~SomeData() { free(_pObj); } malloc和free应该搭配使用的,delete和new是搭配使用的,但是new一个数组的时候语法和malloc是不同的,而它的delete也加上了[]符号。设想未知到_pObj是“new”的结果的时候,析构函数不知道该调用delete还是delete[]释放_pObj指向的内存。
指针实际上指向的是一块内存区域,Obj类型的指针表示它指向的那块内存至少有sizeof(Obj)那么大,至于这块内存有多少个Obj,单从指针来看,是没法知道的。 PS:建议使用vector之类的容器而不是用数组。
Obj
sizeof(Obj)
vector
Obj *p;
p只是一个指向Obj结构或类型的指针。
malloc向系统申请一块内存,成功的话就返回一个地址,在楼主看的代码里应该把这个地址赋给p了。
由于声明的是Obj指针类型,编译器就将这块内存里的内容解释为Obj结构或类型的一个实例(或者说变量)。
p[i]会被编译器翻译成*(p+i), 由于p是Obj类型的,这个表达式表示的就是从p 开始,第i个Obj对象。
我也想说说自己的看法,首先我不知道这个结构会是多大,如果很小的话,要表达结构中包含这个实例变量,我会这样定义一个结构
struct SomeData {
...
Obj _obj;
};
如果结构要包含的是一个元素类型为Obj的数组,但是数组元素个数未可知,那我当然是像使用问题中的指针存放动态数组的首元素地址的方法了。
struct SomeData {
...
};
-----------------------
不过,我不明白C++中为什么要用指针表示未知数组呢,何不用vector呢
---------------------------
题主有注意过结构的构造函数和析构函数吗?
我猜测应该是这样的:
SomeData::SomeData()
{
_pObj = (Obj*)malloc(sizeof(Obj)*someInt);
}
SomeData::~SomeData()
{
free(_pObj);
}
malloc和free应该搭配使用的,delete和new是搭配使用的,但是new一个数组的时候语法和malloc是不同的,而它的delete也加上了[]符号。设想未知到_pObj是“new”的结果的时候,析构函数不知道该调用delete还是delete[]释放_pObj指向的内存。
指针实际上指向的是一块内存区域,
Obj
类型的指针表示它指向的那块内存至少有sizeof(Obj)
那么大,至于这块内存有多少个Obj
,单从指针来看,是没法知道的。PS:建议使用
vector
之类的容器而不是用数组。