如何在C中分配不同类型的内存?

时间:2014-03-27 17:24:30

标签: c arrays pointers struct

我在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的第一个元素?

4 个答案:

答案 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