今天在结构体中使用字符指针,莫名出现段错误。经过查询才知道是成员指针没有初始化!
看看错误代码:
#include <bits\stdc++.h> #pragma warning(disable:4996) using namespace std; char s[2] = { 0 }; struct student { char *m_name; char *m_num; char *m_project; int m_grade; }stu; void Input(); //输入学生信息函数 void Output(); //输出学生信息 int main() { Input(); Output(); system("PAUSE"); return 0; } void Input() { /*cin >> stu.m_name; cin >> stu.m_num; cin >> stu.m_project; cin >> stu.m_grade;*/ strcpy(stu.m_num, "170564564"); strcpy(stu.m_name, "刘然"); strcpy(stu.m_project, "语言"); stu.m_grade = 88; } void Output() { cout << "姓名:" << stu.m_name << endl; cout << "学号:" << stu.m_num << endl; cout << "科目:" << stu.m_project << endl; cout << "成绩:" << stu.m_grade << endl; }
在Input()函数中,未对成员变量字符指针初始化就使用,程序会报错。
初始化的方法在网上有两种:1.将其他变量的内存地址给字符指针 2.重新分配一块内存给指针。但是实测第一种方法没有作用。
第二种方法申请空间,就使用malloc或者new就行了,malloc,new实际上就是系统分配一块内存,一个临时指针指向这块内存,然后将这个临时指针给左值。
成员指针: stu.m_name = (char*)malloc(sizeof(char)) stu.m_name = new char[1]; 结构体指针: stu = (struct student*)malloc(sizeof(struct student)); stu->m_name = (char*)malloc(sizeof(char));
#include <bits\stdc++.h> #pragma warning(disable:4996) using namespace std; char s[2] = { 0 }; struct student { char *m_name; char *m_num; char *m_project; int m_grade; }stu; void Input(); //输入学生信息函数 void Output(); //输出学生信息 int main() { Input(); Output(); system("PAUSE"); return 0; } void Input() { stu.m_name = new char[1]; stu.m_num = new char[1]; stu.m_project = new char[1]; strcpy(stu.m_num, "170564564"); strcpy(stu.m_name, "刘然"); strcpy(stu.m_project, "语言"); stu.m_grade = 88; } void Output() { cout << "姓名:" << stu.m_name << endl; cout << "学号:" << stu.m_num << endl; cout << "科目:" << stu.m_project << endl; cout << "成绩:" << stu.m_grade << endl; }
当然使用字符数组就没压力了,C语言指针果然“你大爷就是你大爷”。 手动滑稽.jpg