【问题标题】:Incorrect output in an array inside a struct结构内的数组中的输出不正确
【发布时间】:2013-06-09 05:46:06
【问题描述】:

我有一个内部带有 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,但每次编译时它都会打印出不同数字的垃圾。我不认为我掌握了结构理念中的结构中的数组。

【问题讨论】:

  • 请发布可以编译的代码...myStruct->array = malloc(sizeof(int) * (lengthOfint); 缺少右括号。另外,我很困惑n=55 是如何导致lengthOfint == 2 的;您是否以位为单位测量并假设sizeof(int) == 4CHAR_BIT == 8?不是不合理的假设,只是位数的使用不是那么明显。
  • 我认为,op 对lengthOfint == ceil(log10(abs(n))) 之类的人来说意味着什么。
  • 这背后的想法是我需要将一个数字存储到一个 int 数组中,所以 12345 将在一个 intArray[5] = {1,2,3,4,5}...所以55 将产生一个大小为 2 的数组。

标签: c arrays pointers struct malloc


【解决方案1】:

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

【讨论】:

  • 当我这样做时,编译器告诉我这是 Initializer 的不兼容类型参数,这是我将其更改为 &myContainer 的唯一原因。当然,我在这里采样的代码并不完整,但它非常准确。
  • 这是一个不兼容的指针类型,因为ContainerintArray 类型确实不兼容。尝试将 Container** 转换为 intarray* 并不能让它变得更好。这些警告的存在是有原因的!
  • 那么解决方法是什么,无论这是我要实现的基础设施 -> 一个包含多个 intArray 结构的容器,每个 intArray 结构都包含一个具有不同数据量的 int 数组。
【解决方案2】:

Container 持有指向struct intArray 的指针,在本例中是struct intArray 数组的开头。但是你用

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

所以 malloc 返回一个指向内存空间的指针,该指针包含指向struct intArray指针,因为您使用了sizeof(intArray *) 而不是sizeof(intArray)(您为Some_Defined_Value 数量分配了空间指针)。

您需要在这里sizeof(intArray) * Some_Defined_ValueSome_Defined_Value 数量的struct intArray 分配空间。

那你就用

Initializer(&myContainer, 5);

这至少应该发出警告,因为您将 pointer 传递给 pointerstruct Container,但 Initializer 需要 pointerstruct 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指针。上面的代码意味着您访问 struct intArray's 数组的第一个元素(元素编号 0)。

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

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

【讨论】:

  • 我正在尝试实现一个包含结构数组的单个容器。每个结构体内部都有一个 int 数组,其中包含一个以数组形式表示的整数 -> 12345 是一个数组 [5]={1,2,3,4,5}
  • 那么你应该对我写的结尾没问题。如果你想在你的容器中初始化第二个intArray,你需要Initializer(&(myContainer->P[1]));并访问它(在初始化之后),myContainter->P[1].array[0]
【解决方案3】:

还要注意 malloc 返回一个 void * 所以大多数时候你需要这样的演员:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多