gpt4 book ai didi

学生结构中的 C 内存分配不起作用

转载 作者:行者123 更新时间:2023-11-30 21:23:46 25 4
gpt4 key购买 nike

我必须在下面的 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 *);

最佳答案

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;
}
}

关于学生结构中的 C 内存分配不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41782234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com