使用malloc,struct数组的大小错误

时间:2015-12-03 15:54:51

标签: c arrays struct

我正在尝试使用malloc创建一个动态结构数组。

I have a struct: 
typedef struct{
    char question[200];
    char answer1[30];
    char answer2[30];
    char answer3[30];
    char correctAnswer[2];
}Questions;

以下代码:

int length = 10;
Questions * qArray = malloc(length*sizeof(*qArray));

出于某种奇怪的原因,即使我改变长度,sizeof(qArray)也会返回4。我如何实际设置数组的正确大小?

5 个答案:

答案 0 :(得分:3)

分配的大小与指向第一个元素的指针无关。

换句话说,你不能这样做,sizeof(qArray)可以从类型中静态计算。

您需要自己在运行时单独跟踪分配的大小。

答案 1 :(得分:3)

使用这些行,您可以为10 Questions

的数组分配内存
int length = 10;
Questions * qArray = malloc(length*sizeof(*qArray));

您可以通过以下方式获得相同的结果:

Questions * qArray = malloc(length*sizeof(Questions));

以前的语法使得以后更改类型变得更容易,并且很多人都喜欢这种语法。

之后:

sizeof(qArray[0]) // size of the first element of the array in bytes (292 probably)
sizeof(*qArray)   // size of the first element of the array in bytes (292 probably)
sizeof(Questions) // size of a struct of type Questions in bytes (292 probably)
sizeof(qArray)    // size of a pointer in your system in bytes (4 or 8 bytes usually)
length            // number of elements in qArray
length*sizeof(*qArray) // total size of the array in bytes

答案 2 :(得分:0)

您只是正确设置数组的大小。问题是你用来恢复规模的方式。

由于一些奇怪的原因,即使我改变长度,sizeof(qArray)也会返回4。

因为qArray是一个指针。因此sizeof(qArray)是指针的大小,即地址的大小,在您的情况下为4个字节。

执行sizeof(*qArray)实际上会为您提供结构Questions的大小,因为*qArray指向结构问题。

<小时/> 如何实际设置数组的正确大小?

要获得数组的完整大小,您需要每次都保持length方便。因为你正在使用指针。就像解开说的那样。

答案 3 :(得分:-1)

您无法获得从指针分配的数组的大小。您已经知道尺寸,因为您必须计算它才能调用malloc()

Questions * qArray = malloc(length*sizeof(*qArray));

如果您需要保留数组的大小:

size_t qArraySize = length * sizeof( *qArray );
qArray = malloc( qArraySize );

答案 4 :(得分:-2)

取决于你想要的东西。

数组中的元素数

length 

数组中的字节数。这应该是malloc的参数。

length*sizeof(Questions)