我试图创建一个包含18个BYTE whit calloc元素的数组,但不知道为什么calloc只返回8个元素,我在堆栈中手动完成并且程序正常工作。 / p>
int arrsize;
BYTE *copyrow;
copyrow = calloc(18, sizeof(BYTE));
arrsize = sizeof(copyrow);
当我在这里编译时arrsize =到18,所以,evrething很好。 但是当我使用calloc时:
from collections import defaultdict
def query_to_dict(student_results):
result = defaultdict(list)
for obj in student_results:
instance = inspect(obj)
for key, x in instance.attrs.items():
result[key].append(x.value)
return result
output = query_to_dict(students)
现在编译器说arrsize = 8,所以我不知道这里发生了什么。需要帮助。
答案 0 :(得分:4)
当您定义BYTE *copyrow;
时,copyrow
是一个指针,并且指针的大小在64位架构上为8
,无论" big"它指向的内存块。
BYTE copyrow[18];
是一个包含18个BYTE
- 元素的数组,此类数组的大小为18 * sizeof(BYTE)
。
你可以这样做:
int nrOfElements = 18; // could be dynamically set as well.
BYTE *copyrow = calloc(nrOfElements, sizeof(BYTE));
int arrsize = sizeof(BYTE) * nrOfElements;
答案 1 :(得分:2)
数组和指针是不同的东西。
在许多情况下,数组会衰减为指针,但它们本质上是不同的。
BYTE copyrow[18];
arrsize = sizeof(copyrow);
此处sizeof
显示整个数组的大小,即18 * sizeof(BYTE)
。
BYTE *copyrow;
arrsize = sizeof(copyrow);
此处sizeof
显示指针的大小,与指向的内容无关。
答案 2 :(得分:0)
对我而言,当我开始使用C时,这也是一个令人困惑的话题。看起来sizeof()
的实现方式不同,具体取决于论证的内容。
sizeof()
在编译时进行评估,int a[n]; sizeof(a);
工作的唯一原因是因为在编译时出现了计算其大小所需的所有信息。
BYTE copyrow[18];
arrsize = sizeof(copyrow);
(正如其他人指出的那样)被解释为......
BYTE copyrow[18];
arrsize = sizeof(BYTE)*18;
...由编译器。因此,动态案例看起来是一样的:
BYTE *copyrow;
copyrow = (BYTE*) calloc(18, sizeof(BYTE));
arrsize = sizeof(BYTE)*18;