我正在尝试使用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
。我如何实际设置数组的正确大小?
答案 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)