【问题标题】:C memory allocation in student structure not working学生结构中的 C 内存分配不起作用
【发布时间】:2017-06-06 12:56:41
【问题描述】:

我必须在下面的internal.h中实现这些功能:

#ifndef STUDENT_INTERNAL_H
#define STUDENT_INTERNAL_H

#include "student.h"

/** Allocate memory for a new @ref student object. */
struct student *student_alloc(void);

/*** Initialize an already-allocated @ref student object.
* @returns   NULL on failure but does not free the memory
*/

struct student *student_init(struct student *, const char *name, size_t namelen, 
                             struct student_id, student_complete);

#endif /* STUDENT_INTERNAL_H */

这是我到目前为止所拥有的,但我很困惑并且它不起作用:

#include <sys/types.h>
#include "common.h"
#include "student.h"
#include "transcript.h"
#include "internal.h"

/**
* Initialize an already-allocated @ref student object.
* @returns   NULL on failure but does not free the memory
*/
struct student *student_init(struct student *student, const char *name, size_t namelen,
                             struct student_id stud_id, student_complete stud_complete) {

    struct student *initialized_student;

    name = malloc(sizeof(namelen));
    initialized_student = malloc(sizeof (student));

    if (student_alloc()) {
        initialized_student->s_name = name;
        initialized_student->s_id = stud_id;
        initialized_student->s_complete = stud_complete;

        return initialized_student;
    } else {
        return 0;
    }
}

stud_complete 这是一个函数指针,它在一个不同的头文件 student.h 中声明,例如typedef int (*student_complete)(struct student *);

【问题讨论】:

  • 或许学习如何使用调试器是个好主意
  • initialized_student = malloc(sizeof (student)); 是错误的 -->> initialized_student = malloc(sizeof (struct student)); 甚至更好:initialized_student = malloc(sizeof *initialized_sudent);name = malloc(sizeof(namelen)); 也是错误的。

标签: c memory-management malloc function-pointers dynamic-programming


【解决方案1】:

API 令人困惑:

namelen 是什么?

  • 是学生姓名name的首字母长度吗?在这种情况下,您应该为空终止符分配一个额外的字节并适当地复制名称。
  • 是学生姓名的最大长度吗?同样,如果这是长度而不是大小,则空终止符需要一个额外的字节。
  • 无论如何sizeof(namelen) 都是不合适的。

student_alloc() 是做什么的?

同样,传递给malloc() 以分配student 结构的大小应该是struct student 的大小或更可靠的是目标指针指向的类型的大小。

这是一个更正的版本:

struct student *student_init(struct student *student, const char *name, size_t namelen,
                             struct student_id stud_id, student_complete stud_complete) {

    struct student *initialized_student = malloc(sizeof(*initialized_student));
    char *s_name = calloc(namelen + 1);

    if (initialized_student && s_name && student_alloc()) {
        strncat(s_name, name, namelen);
        initialized_student->s_name = s_name;
        initialized_student->s_id = stud_id;
        initialized_student->s_complete = stud_complete;
        return initialized_student;
    } else {
        free(initialized_student);
        free(s_name);
        return 0;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多