C 结构内部数组中的输出不正确
我有一个结构,里面有一个int数组,我将它传递给一个函数以初始化数组 像这样的数组结构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)
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]
。