Calloc() 不分配零

Calloc() not assigning zeros

我想创建一个封装动态分配数组的结构。它看起来像这样:

typedef struct IntArray {
    int *field;
    size_t length;
} IntArray;

然后,我有一个函数可以创建这样一个 IntArray 结构:

IntArray *createIntArray(size_t length) {
    IntArray *output;

    if ((output = malloc(sizeof(IntArray))) == NULL) {
        return NULL;
    }

    output->field = calloc(length, sizeof(int));
    output->length = length;

    return output;
}

主要内容如下:

int main() {
    size_t size = 10;
    IntArray *test = createIntArray(size);

    for (int i = 0; i < size; i++) {
        printf("%d\n", test[i]);
    }
}

我希望 calloc() 用零初始化内存,但是输出很奇怪:


我认为这些数字是内存地址,但它们来自哪里?每次我启动程序时,数字都会改变,但保持在 1. 和 6. 位置..

为什么会这样?

编辑:

我在Whosebug上不小心把calloc和malloc搞混了,上面的代码确实出现了问题

变量是IntArray类型,但是你分配了一个`int数组。因此,您会遇到未定义的行为错误。

有一个名为 createIntArray 的函数也很奇怪,它动态创建一个 int 数组数组,而不是像我期望的那样只创建一个数组。这也是一个奇怪的依赖关系,因为它强制调用者始终使用数组数组。

您可能完全想要别的东西。也许是这样的:

#include <stdlib.h>
#include <assert.h>

typedef struct IntArray {
    size_t length;
    int field[];
} IntArray;

IntArray* createIntArray(size_t length) 
{
  IntArray* result;
  result = calloc(1, sizeof(IntArray) + sizeof(int[length]));
  assert(result != NULL);

  result->length = length;  
  return result;
}

int main (void)
{
  IntArray* array[3];
  for(size_t i=0; i<3; i++)
  {
    array[i] = createIntArray(10);
  }
}

您正在尝试将结构打印为 int。如果你打开 on/up 编译器警告(-Wall 如果你使用 gcc),一个好的编译器会警告你。

CreateIntArray 创建单个 IntArray,大小 field,大小 length。 如果您想打印分配的 int 数组,您可以使用以下内容:

int main() {
    size_t size = 10;
    IntArray *test = createIntArray(size);

    for (int i = 0; i < size; i++) {
        printf("%d\n", test->field[i]);
    }
}