我在代码中看到了下一个声明:
SomeType someVar[1];
以后someVar
用作指向SomeType
的指针。为什么会这样宣布它而不是:
SomeType* someVar;
编辑:正如许多人所指出的,我需要指定上下文。
struct SomeStruct
{
size_t count;
SomeType someVar[1];
};
SomeStruct* str = malloc(sizeof(SomeStruct) + sizeof(SomeType) * count);
str->count = count
...
从这一点开始, str->someVar
用作count
元素SomeType
的数组。
答案 0 :(得分:2)
SomeType someVar[1];
someVar
是一个类型SomeType
的数组,包含1个元素。
SomeType* someVar;
someVar
是指针(悬空,你还没有指出任何东西)SomeType
类型。
你可以使用数组的名称作为指向该数组第一个元素的指针的简写。
答案 1 :(得分:1)
因为一般来说他们不一样。第一个定义SomeType的一个元素数组,另一个定义指向SomeType的指针。
第一个为该元素分配内存,另一个不分配内存。
一般来说:sizeof(SOmeType[1]) != sizeof(SomeType*).
答案 2 :(得分:0)
第一个可以被视为指向可能未初始化的SomeType
的指针(如果它是非POD类型则初始化)。第二个只是一个悬垂的指针。
SomeType someVar[1];
someVar[0]; //valid
*someVar; //valid
VS
SomeType* someVar;
someVar[0]; //invalid
*someVar; //invalid
对于第二个工作,你需要让它指向一个有效的东西,所以要么是一个现有的对象(那么指针就没有意义),要么指向一个用{{1分配的新对象在这种情况下,你必须自己调用new
。
答案 3 :(得分:0)
如果您使用SomeType *,则在某个时刻需要new
,因此您必须delete
以避免泄漏。
使用SomeType []在堆栈上分配,将为您处理内存管理。
答案 4 :(得分:0)
SomeType someVar[1];
在堆栈上分配内存,它为您提供了一个块/函数作用域变量。因此,当它超出块/功能时,它将自动销毁。
SomeType* someVar;
是一个指针(尚无意义),因此它不会为SomeType
分配任何指针。但是,如果您有这样的事情:
SomeType* someVar = malloc(sizeof(SomeType));
相当于:
SomeType* someVar = new SomeType(...);
然后就是堆上的内存分配。因此,当它超出范围时它不会被销毁,需要由free
或delete
手动销毁。