Calloc()没有分配零

时间:2017-05-04 10:47:02

标签: c struct calloc

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

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()用零初始化内存,但是输出很奇怪:

screenshot

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

为什么会这样?

编辑:

我偶然在stackoverflow上混淆了calloc和malloc,问题实际上发生在上面的代码

2 个答案:

答案 0 :(得分:3)

您正在尝试将结构打印为int。如果你打开/编译编译器警告(-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]);
    }
}

答案 1 :(得分:0)

变量的类型为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);
  }
}