Dinamic数组不会分配与堆栈数组相同数量的元素

时间:2018-03-21 19:59:14

标签: c

我试图创建一个包含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,所以我不知道这里发生了什么。需要帮助。

3 个答案:

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