【发布时间】:2020-07-19 02:16:41
【问题描述】:
我是 C 新手,我尝试创建一个返回指针的函数。我使用了不同的方法来做到这一点:
1.
typedef struct student{
int age;
}student;
student *create_student(){
student* s;
s-> age= 24;
return s;
}
int main() {
student* s = create_student();
printf("the student age is %d", s->age);
return 0;
}
它可以编译,但似乎不起作用。
2.
typedef struct student{
int age;
}student;
student *create_student(){
student* s;
student s2;
s2.age = 24;
s = &s2;
return s;
}
int main() {
student* s = create_student();
printf("the student age is %d", s->age);
return 0;
}
它似乎有效,并打印“学生年龄为 24 岁”,但如果我在之前的 printf 之前添加了一条 printf 语句:
int main() {
student* s = create_student();
printf("This is a test\n");
printf("the student age is %d", s->age);
return 0;
}
它给了我:
这是一个测试
学生年龄为-1422892954
3.
如果我使用以下方式:
typedef struct student{
int age;
}student;
student *create_student(){
student* s = malloc(sizeof(student));
s -> age = 24;
return s;
}
int main() {
student* s = create_student();
// printf("This is a test\n");
printf("the student age is %d", s->age);
return 0;
}
无论有无注释的 printf,它都适用于这两种情况
我只想知道 1 和 2 失败的原因是什么。为什么 3 有效? 一般来说,什么时候应该使用 malloc,什么时候不应该使用?
谢谢
【问题讨论】:
-
1.
student* s;s指向什么有效内存? (它的值是什么地址) 2.s2是函数本地的,在函数返回时被销毁(无效)。回到 1.student *s = malloc (sizeof *s);然后验证分配成功if (!s) { /* handle error */ }3. 因为malloc将起始地址返回到分配的内存块,然后将其存储为s的值(即s指向分配的块),您可以使用它直到它被释放(或程序结束)。 -
对于你的最后一个问题,当你不知道你需要多少东西时,你动态分配,所以你声明了一些,跟踪你用了多少,@987654333 @more 当最初分配的块被填满时。或者,您需要的东西超出了程序堆栈的容量,您可以分配或声明为
static(或全局声明)。否则,如果您事先知道需要多少,并且可以放入堆栈,只需声明它们的数组即可。 -
关于:
student *create_student(){ student* s;此指针未初始化为指向应用程序拥有的内存。因此,写入指针指向的任何字段都是未定义的行为,并可能导致段错误事件。建议改成:student* s = malloc( sizeof( student );