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]);
}
}
我想创建一个封装动态分配数组的结构。它看起来像这样:
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]);
}
}