为什么使用SomeType [1]而不是SomeType *作为结构中的最后一个成员

时间:2013-11-26 09:00:35

标签: c++

我在代码中看到了下一个声明:

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的数组。

5 个答案:

答案 0 :(得分:2)

SomeType someVar[1];

someVar是一个类型SomeType的数组,包含1个元素。

SomeType* someVar;

someVar指针(悬空,你还没有指出任何东西)SomeType类型。

  

你可以使用数组的名称作为指向该数组第一个元素的指针的简写。

Will Dean

答案 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)

  1. SomeType someVar[1];在堆栈上分配内存,它为您提供了一个块/函数作用域变量。因此,当它超出块/功能时,它将自动销毁。

  2. SomeType* someVar;是一个指针(尚无意义),因此它不会为SomeType分配任何指针。但是,如果您有这样的事情:

  3. SomeType* someVar = malloc(sizeof(SomeType));

    相当于:

    SomeType* someVar = new SomeType(...);

    然后就是堆上的内存分配。因此,当它超出范围时它不会被销毁,需要由freedelete手动销毁。