结构如下,内部结构在外部结构内。两个结构都是动态分配的。当我尝试通过引用访问内部结构来更改地址值时出现问题。
例如:
typedef struct{
char address[32];
}inner;
typedef struct{
struct inner innerStruct;
}outer;
main(){
int i = 0;
outer* outerArray;
outer* outerReference;
inner* innerReference;
/* create 20 outer structs */
outerArray = malloc(20 * sizeof(outerArray*));
/* for each outer struct, dynamically allocate 10 inner structs */
for(i = 0; i < 10; i++)
{
outerReference = outerArray + i;
outerReference->innerStruct = malloc(10 * sizeof(outerReference->innerStruct);
}
}
如何访问outerArray[3][innerStruct[4]
,第4个外部结构的第5个内部结构并更改其地址值?
答案 0 :(得分:2)
如果您想使用innerStruct
,则将inner *
声明为struct inner
,而不是malloc()
。
正如您所声明的那样,inner
的内存将在您创建outer
时分配。
另请注意,由于您使用了typedef
,因此在声明该类型的变量时不需要struct
关键字。
以下是编译和运行代码的更正版本:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char address[32]; // 32 chars are allocated when an inner is created
} inner;
typedef struct {
inner innerStruct; // innerStruct is allocated when an outer is created
} outer;
typedef struct {
inner *innerStruct; // innerStruct must be allocated explicitly
} outer2;
int main(int argc, char *argv[]) {
int i = 0;
outer *outerArray;
outer2 *outer2Array;
outer *outerReference;
outer2 *outer2Reference;
/* create 20 outer structs (should check for out-of-mem error) */
outerArray = malloc(20 * sizeof(outer));
for (i = 0; i < 10; ++i) {
outerReference = outerArray + i; // ptr to i'th outer
// Note: innerStruct.address bcz it's a structure
sprintf(outerReference->innerStruct.address, "outer struct %d", i);
}
/* create 20 outer2 structs */
outer2Array = malloc(20 * sizeof(outer2));
/* for each outer struct, dynamically allocate 10 inner structs */
for (i = 0; i < 10; ++i) {
outer2Reference = outer2Array + i;
outer2Reference->innerStruct = malloc(sizeof(inner));
// Note: innerStruct->address bcz it's a pointer
sprintf(outer2Reference->innerStruct->address, "outer2 struct %d", i);
}
/* print all the data and free malloc'ed memory */
for (i = 0; i < 10; ++i) {
printf("outer: %-20s, outer2: %-20s\n",
outerArray[i].innerStruct.address,
outer2Array[i].innerStruct->address);
free(outer2Array[i].innerStruct);
}
free(outer2Array);
free(outerArray);
return 0;
}
答案 1 :(得分:0)
打印第4个外部结构的第5个内部结构的成员address
,将数据复制到其中并再次打印:
#include <stdio.h>
#include <stdlib.h>
typedef struct{
char address[32];
}inner;
typedef struct{
inner* innerStruct;
}outer;
int main()
{
int i = 0;
outer* outerArray;
outer* outerReference;
/* inner* innerReference; */ /* unused */
/* create 20 outer structs */
outerArray = malloc(20 * sizeof(*outerArray));
/* for each outer struct, dynamically allocate 10 inner structs */
for(i = 0; i < 10; i++)
{
outerReference = outerArray + i;
outerReference->innerStruct = malloc(10 * sizeof(*outerReference->innerStruct));
}
printf("address: '%s'\n", outerArray[3].innerStruct[4].address);
strcpy(outerArray[3].innerStruct[4].address, "<emtpy>");
printf("address: '%s'\n", outerArray[3].innerStruct[4].address);
return 0;
}
下次发布代码时,请大家好好编译。