我在C中有以下代码:
typedef struct
{
int age;
int phoneNumber;
} Student;
typedef struct
{
int id;
int student[1];
} People;
#define NUM_OF_PEOPLE
void *p = malloc(sizeof(People) + sizeof(int) * NUM_OF_PEOPLE + sizeof(Student) * NUM_OF_PEOPLE);
我怎样才能找到指向内存的指针指向内存中struct Student
的第一个元素?
我尝试按以下方式进行:
int i = 0;
for(i = 0; i < NUM_OF_PEOPLE; i++)
{
Student * student_p = p.student[NUM_OF_PEOPLE];
}
它不起作用,所以我们可以分配内存吗?
以及如何在内存中找到struct Student
的第一个元素?
答案 0 :(得分:1)
你所拥有的是一种拥有灵活阵列成员的古老方式,这在技术上也是未定义的行为。
您正在寻找this。
首先,你需要像这样定义你的结构(我不知道ints
之前的Students
是什么,所以让我们把它称为id):< / p>
typedef struct
{
int age;
int phoneNumber;
} Student;
typedef struct
{
int id;
Student student;
} StudentAndId;
typedef struct
{
int id;
StudentAndId students[];
} People;
请注意People
内的数组中缺少大小。现在你这样做:
People *p = malloc(sizeof(People) + sizeof(StudentAndId[NUM_OF_PEOPLE]));
然后,您可以访问students
中的p
,就像它是NUM_OF_PEOPLE
元素的数组一样。
请记住使用C99(或C11)支持进行编译。使用gcc -std=c99
或-std=gnu99
。
答案 1 :(得分:0)
这将分配用于存储日期的内存,但是如何访问它取决于您存储日期的方式。使用C指针,您可以使用此结构和分配来存储和访问数据,但访问成员将不是直接的。它将涉及指针算术。如果可能的话,最好使用其他结构。如果使用这种分配方式,那么你需要做指针运算来获得下一个元素。
答案 2 :(得分:0)
试试这个:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int age;
int phoneNumber;
} Student;
typedef struct
{
int id;
int student[1];
} People;
#define NUM_OF_PEOPLE 10
int main()
{
People *p = malloc(sizeof(People) + sizeof(int) * NUM_OF_PEOPLE + sizeof(Student) * NUM_OF_PEOPLE);
int* id = (int*)(p+1);
Student* s = (Student*)(id+NUM_OF_PEOPLE);
printf("Size of People : %d\n", sizeof(People));
printf("p points to : %p\n", p);
printf("id points to : %p\n", id);
printf("s points to : %p\n", s);
}
以下是示例输出:
Size of People : 8 p points to : 0x80010460 id points to : 0x80010468 s points to : 0x80010490
答案 3 :(得分:0)
您可能希望将id
字段添加到Student
数据结构中,例如:
typedef struct {
int id;
int age;
int phoneNumber;
} Student;
然后,您可以定义一个具有固定标题的结构(在这种情况下,这可以是学生数),然后是一个可变大小的Student
s数组:
#define ARRAY_OF_ANY_SIZE 1
typedef struct {
int count;
Student students[ARRAY_OF_ANY_SIZE];
} People;
This blog post解释了这种使用&#34;大小为1&#34; 的数组的技巧,包括对对齐问题的讨论。
我在这里不会重复原始的博文代码。只需考虑您可以使用便携式offsetof()
而不是Windows特定的FIELD_OFFSET()
宏。
作为示例代码,您可能需要考虑以下事项:
#include <stdio.h> /* For printf() */
#include <stddef.h> /* For offsetof() */
#include <stdlib.h> /* For dynamic memory allocation */
typedef struct {
int id;
int age;
int phoneNumber;
} Student;
#define ARRAY_OF_ANY_SIZE 1
typedef struct {
int count;
Student students[ARRAY_OF_ANY_SIZE];
} People;
int main(int argc, char* argv[]) {
People* people;
const int numberOfStudents = 3;
int i;
/* Dynamically allocate memory to store the data structure */
people = malloc(offsetof(People, students[numberOfStudents]));
/* Check memory allocation ... */
/* Fill the data structure */
people->count = numberOfStudents;
for (i = 0; i < numberOfStudents; i++) {
people->students[i].id = i;
people->students[i].age = (i+1)*10;
people->students[i].phoneNumber = 11000 + i;
}
/* Print the data structure content */
for (i = 0; i < people->count; i++) {
printf("id: %d, age=%d, phone=%d\n",
people->students[i].id,
people->students[i].age,
people->students[i].phoneNumber);
}
/* Release the memory allocated by the data structure */
free(people);
return 0;
}
输出:
id: 0, age=10, phone=11000 id: 1, age=20, phone=11001 id: 2, age=30, phone=11002