结构体指针与->运算符问题:let_comment函数编译报错求助
问题分析与解决
错误根源
- 数组访问错误:
MOVIE结构体里的comments是长度为50的COMMENT数组,f->comments是数组首地址,不是单个COMMENT对象,不能直接用.text访问成员,必须指定具体数组索引(比如f->comments[0]表示第一条评论)。 - 字符串赋值错误:C语言中char数组无法直接用
=赋值,必须用strcpy函数完成字符串复制,且需要引入<string.h>头文件。 - 函数参数缺失:原
let_comment函数没有指定要添加到哪条评论的位置,需要补充索引参数或在函数内部查找空评论位置。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> // 引入strcpy所需头文件 typedef struct comment {char text[256], name[64];} COMMENT; typedef struct movie {char name[64]; double mark; COMMENT comments[50];} MOVIE; // 新增index参数,指定评论在数组中的位置 int let_comment(MOVIE *f, int index, char *text, char *name); int main() { MOVIE *p_movie; char text1[256], name1[64]; char *p_text = text1, *p_name = name1; // 内存分配失败检查 p_movie = (MOVIE*)malloc(5 * sizeof(MOVIE)); if (!p_movie) { perror("malloc failed"); return 1; } printf("Input movie data:\n"); for(int i = 0; i < 5; i++) { printf("Name: "); scanf("%s", (p_movie + i)->name); (p_movie + i)->mark = 0.0; // 初始化评分字段 } // 为每个电影添加第一条评论(索引0) for(int i = 0; i < 5; i++) { let_comment(p_movie + i, 0, p_text, p_name); } // 验证结果:打印第一个电影的第一条评论 printf("\nFirst movie's first comment:\n"); printf("Text: %s\n", p_movie->comments[0].text); printf("Author: %s\n", p_movie->comments[0].name); free(p_movie); // 释放内存,避免泄漏 return 0; } int let_comment(MOVIE *f, int index, char *text, char *name) { // 检查索引合法性 if (index < 0 || index >= 50) { printf("Invalid comment index\n"); return -1; } printf("Input comment: "); scanf("%s", text); printf("Comment editor: "); scanf("%s", name); // 用strcpy完成字符串复制 strcpy(f->comments[index].text, text); strcpy(f->comments[index].name, name); return 0; }
核心修改说明
- 引入
<string.h>头文件,使用strcpy替代直接赋值操作,符合C语言字符串处理规则。 - 给
let_comment增加index参数,明确指定评论要存入数组的位置。 - 修改成员访问方式:通过
f->comments[index].text定位到具体评论对象后,再访问其成员字段。 - 补充内存分配失败检查和内存释放逻辑,提升代码健壮性。
- 初始化电影评分字段,避免未定义值。
内容的提问来源于stack exchange,提问作者KeyboardSound
相关产品推荐
相关产品推荐

