结构指针和指针 char 数组 malloc 数组

Structer pointer and pointer char array malloc array

我想做结构数组,但我不知道结构数组的大小,因此我需要使用指针结构,我想在结构中做字符数组,但我不知道字符数组的大小,因此我需要在此结构中使用指针 char,但我不了解 malloc 和 realloc 函数。我怎样才能做到这一点 ?

#include <stdio.h>
#include <stdlib.h>

struct School{
    char *school_name;
    int student_size;
}*high_school;




void createSchool(struct School *s, char *schl_name, int student, int school_size)
{
    int i = 0;

    if(school_size == 1){
        s = (struct School*) malloc(sizeof(struct School));
    }
    else{
        s = (struct School*) realloc(s, (school_size*sizeof(struct School)));
    }

    (s+(school_size-1))->student_size = student;
    (s+(school_size-1))->school_name = (char *) malloc(20); // 20 it is not important

    (s+(school_size-1))->school_name = schl_name;
     for(i; i<school_size; i++){
        printf("%s\t%d\n",(s+i)->school_name, (s+i)->student_size);
    }
    printf("\n\n");
}

int main()
{
    int i = 1;
    createSchool(high_school, "Harvard", 50, i);
    i++;
    createSchool(high_school, "Oxford", 40, i);
    i++;
    createSchool(high_school, "MIT", 30, i);
}

我要截屏:

Harvard 50

Harvard 50
Oxford 40

Harvard 50
Oxford 40
MIT 30

但是程序的屏幕截图:

Harvard 50


└1q     7405760
Oxford  40


        7405760
(null)  0
MIT     30

您在 createSchool 中的指针具有局部作用域,因此不会修改全局指针。更快的解决方法是 return 新分配的内存返回给调用者。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct School{
    char *school_name;
    int student_size;
}*high_school;

struct School* createSchool(struct School *s, char *schl_name, int student, int school_size)
{

    if(school_size == 1)
    {
        s = malloc(sizeof(struct School));
    }
    else
    {
        s = realloc(s, (school_size*sizeof(struct School)));
    }

    if (s != NULL)
    {
        s[school_size-1].student_size = student;
        s[school_size-1].school_name = malloc(strlen(schl_name)+1);

        strcpy(s[school_size-1].school_name, schl_name);

        for(int i=0; i<school_size; i++)
        {
            printf("%s\t%d\n", s[i].school_name, s[i].student_size);
        }
        printf("\n\n");
    }

    return s;
}

int main(void)
{
    int i = 1;
    high_school = createSchool(high_school, "Harvard", 50, i);
    i++;
    high_school = createSchool(high_school, "Oxford", 40, i);
    i++;
    high_school = createSchool(high_school, "MIT", 30, i);
}
  1. main 的最小签名是 int main (void)
  2. 请注意,必须检查 malloc/realloc returned 值。
  3. 使用您的代码,如果 realloc 失败,您将丢失指向已分配内存的指针。所以你应该使用临时指针来存储 realloc 结果并检查完整性。之后,您可以将其重新分配给您的指针。

struct School* createSchool(struct School *s, char *schl_name, int student, int school_size)
{

    if(school_size == 1){
        s = malloc(sizeof(struct School));
    }
    else
    {
        struct School *temp = realloc(s, (school_size*sizeof(struct School)));

        if (temp == NULL)
            return s;

        s = temp;    
    }

    if (s != NULL)
    {
        s[school_size-1].student_size = student;
        s[school_size-1].school_name = malloc(strlen(schl_name)+1);

        strcpy(s[school_size-1].school_name, schl_name);

        for(int i=0; i<school_size; i++)
        {
            printf("%s\t%d\n", s[i].school_name, s[i].student_size);
        }
        printf("\n\n");
    }

    return s;
}

可以使用双指针实现不同的解决方案:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct School{
    char *school_name;
    int student_size;
}*high_school;

void createSchool(struct School **s, char *schl_name, int student, int school_size)
{

    if(school_size == 1)
    {
        *s = malloc(sizeof(struct School));
    }
    else
    {
        struct School *temp = realloc(*s, (school_size*sizeof(struct School)));

        if (temp == NULL)
            return;

        *s = temp;
    }

    if (*s != NULL)
    {
        (*s)[school_size-1].student_size = student;
        (*s)[school_size-1].school_name = malloc(strlen(schl_name)+1);

        strcpy((*s)[school_size-1].school_name, schl_name);

        for(int i=0; i<school_size; i++)
        {
            printf("%s\t%d\n", (*s)[i].school_name, (*s)[i].student_size);
        }
        printf("\n\n");
    }
}

int main(void)
{
    int i = 1;
    createSchool(&high_school, "Harvard", 50, i);
    i++;
    createSchool(&high_school, "Oxford", 40, i);
    i++;
    createSchool(&high_school, "MIT", 30, i);
}

最后要注意的是,要分配学校名称,您可以简单地使用:

    (*s)[school_size-1].school_name = schl_name;