结构内部数组中的输出不正确

时间:2013-06-12 23:15:56

标签: c arrays pointers struct malloc

我有一个带有int数组的结构,我正在传递给一个函数来初始化数组

像这样的数组结构..

typedef struct Container{
    struct intArray *P;
    int length;
} Container;

typedef struct intArray{
    int *array;
    int length;
} intArray;

初始化数组的函数 像这样...

int Initializer(intArray *myStruct, int n)
{
    myStruct->array = malloc(sizeof(int) * (lengthOfint);
                                              ^
                                        If n=55 then length would be 2
    //let's just say n=5
    myStruct->array[0] = n;

    //return 1 if successful
    return 1;
}

在另一个函数中,我正在调用初始化函数...

Container *myContainer = malloc(sizeof(Container));

myContainer->P = malloc(sizeof(intArray *) * Some_Defined_Value);

Initializer(&myContainer, 5);

printf("the data that should be at index 0 -> %d\n", myContainer->P.array[0];

我认为printf语句会打印5,但每次编译时都会打印出不同数量的垃圾。我不认为我在struct idea中的结构中掌握了数组。

3 个答案:

答案 0 :(得分:1)

您将容器传递给初始化函数,但如果仔细观察,您会看到您正在向指针指向"外部"容器而不是指向所需struct intArray的指针。您需要Initializer(myContainer->P, 5);

之类的内容

答案 1 :(得分:0)

另请注意,malloc会返回void *,所以大部分时间都需要这样的演员:

myStruct->array = (int*)malloc(sizeof(int) * (length);
//                ^^^^^^

假设length是您想要存储在数组中的int数。

答案 2 :(得分:0)

Container包含指向struct intArray的指针,在这种情况下,它是struct intArray数组的开头。但是你用

初始化这个指针
malloc(sizeof(intArray *) * Some_Defined_Value);

所以malloc返回一个指向内存空间的指针,该指针将指针保存到struct intArray,因为你使用了sizeof(intArray *)而不是sizeof(intArray)(你为{{分配了空间) 1}} 指针的数量)。

此处需要Some_Defined_Valuesizeof(intArray) * Some_Defined_ValueSome_Defined_Value分配空间。

然后你使用

struct intArray

至少应该发出警告,因为您将指针传递给指针Initializer(&myContainer, 5); ,但struct Container期望指针Initializer,所以这不是你想要的。要初始化struct intArray数组的第一个元素,请使用:

struct intArray

然后:

Initializer(&(myContainter->P[0]), 5);

此代码无法编译,因为它应该是:

printf("the data that should be at index 0 -> %d\n", myContainer->P.array[0]));

printf("the data that should be at index 0 -> %d\n", myContainer->P[0].array[0]); 访问指针myContainer->P。上面的代码意味着您访问struct intArray数组的第一个元素(元素编号0)。

初始化/访问struct intArray数组的第二个元素:

struct intArray