Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构内部数组中的输出不正确_C_Arrays_Pointers_Struct_Malloc - Fatal编程技术网

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

C 结构内部数组中的输出不正确,c,arrays,pointers,struct,malloc,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)

我有一个结构,里面有一个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];
在另一个函数中,我调用初始化函数,如下所示

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中的struct中的数组。

您将容器传递给初始值设定项函数,但如果仔细观察,您会发现您传递的是指向“外部”容器的指针,而不是指向所需的
struct intArray
的指针。您可能需要类似于
初始值设定项(myContainer->P,5)的东西

还要注意
malloc
返回一个
void*
,所以大多数时候你需要这样的强制转换:

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

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

容器
包含一个指向
struct intArray
的指针,在本例中,它是
struct intArray
数组的开始。但是,然后用

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

您需要
sizeof(intArray)*一些定义的\u值
在这里为
一些定义的\u值
结构intArray的数量分配空间

然后你用

Initializer(&myContainer, 5);
它至少应该给出一个警告,因为您将指针传递给
结构容器的指针,但
初始值设定项
要求将指针传递给
结构数组
,所以这不是您想要的。要初始化
struct intArray
数组的第一个元素,请使用:

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

此代码不可编译,因为它应该是:

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

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

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

请发布可以编译的代码…
myStruct->array=malloc(sizeof(int)*(lengthOfint);
缺少一个右括号。另外,我对
n=55
如何导致
lengthOfint==2
感到困惑;您是否以位为单位进行测量并假设
sizeof(int)==4
字符位==8
?这不是不合理的假设,但使用位计数并不那么明显。我认为,op对于
lengthOfint==ceil(log10(abs(n))
之类的人来说意味着什么。其背后的思想是我需要将一个数字存储到一个整数数组中,以便12345将位于整数数组中[5]={1,2,3,4,5}…因此55将产生一个大小为2的数组。编译器告诉我,当我这样做时,初始化器的类型参数不兼容,这是我将其更改为&myContainer的唯一原因。当然,我在这里采样的代码不是完整的,但它非常准确。它是一个不兼容的指针类型,因为类型
容器
intArray
确实是不兼容的。尝试将
Container**
转换为
intArray*
并不能使它变得更好。这些警告的存在是有原因的!所以,无论我尝试实现的基础结构是什么,解决方法是什么->一个包含多个intArray结构和每个intArray st的容器UCT包含一个包含不同数据量的整数数组。我试图实现一个容器,其中包含一个结构数组。每个结构中都有一个整数数组,它包含一个以数组形式表示的整数->12345是一个数组[5]={1,2,3,4,5}那么你应该对我写的文章的结尾没问题。如果你想初始化容器中的第二个
intArray
,你需要
初始化器(&(myContainer->P[1]);
并访问它(初始化后),
myContainer->P[1]。数组[0]