我想创建一个封装动态分配数组的结构。它看起来像这样:
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.位置..
为什么会这样?
编辑:
我偶然在stackoverflow上混淆了calloc和malloc,问题实际上发生在上面的代码
答案 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);
}
}