gpt4 book ai didi

c - 使用结构指针访问 C 中的结构成员时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 00:51:33 25 4
gpt4 key购买 nike

我的程序出了什么问题,当我尝试打印值时出现段错误。

我的目标是在 sample_function 中分配一些值。

在 main 函数中,我想将结构复制到另一个结构。

#include<stdio.h>
#include<string.h>

typedef struct
{
char *name;
char *class;
char *rollno;
} test;

test *
sample_function ()
{
test *abc;
abc = (test *)malloc(sizeof(test));

strcpy(abc->name,"Microsoft");
abc->class = "MD5";
abc->rollno = "12345";
printf("%s %s %s\n",abc->name,abc->class,abc->rollno);
return abc;

}

int main(){

test *digest_abc = NULL;
test *abc = NULL;

abc = sample_function();

digest_abc = abc;
printf(" %s %s %s \n",digest_abc->name,digest_abc->class,digest_abc->rollno);

return 1;

}

指针对我来说一直是个噩梦,我从来不理解它。

最佳答案

test * sample_function ()
{
test *abc;

strcpy(abc->name,"Surya");

你认为 abc 在这里指向什么?答案是,它并没有真正指向任何东西。您需要将其初始化为某些东西,在本例中这意味着分配一些内存。

那么,让我们解决第一个问题:

test * sample_function ()
{
test *abc = malloc(sizeof(*abc));

strcpy(abc->name,"Surya");

现在,abc 指向某物,我们可以在其中存储东西!

但是... abc->name 也是一个指针,您认为that 指向什么?同样,它并没有真正指向任何东西,您当然不能假设它指向可以存储字符串的地方。

那么,让我们解决第二个问题:

test * sample_function ()
{
test *abc = malloc(sizeof(*abc));

abc->name = strdup("Surya");
/* ... the rest is ok ... */
return abc;
}

现在,还有最后一个问题:您永远不会释放您刚分配的内存(这在这里可能不是问题,但在完整程序中它会是一个错误)。

所以,在 main 的末尾,你应该有类似的东西

    free(abc->name);
free(abc);
return 1;
}

最后一个问题是设计问题:您的结构中有三个指针,只有约定可以帮助您记住哪个是动态分配的(并且必须释放)以及哪个指向字符串文字(并且不能 被释放)。

没关系,只要所有地方都遵循这个约定。一旦动态分配 classrollno,就会发生内存泄漏。一旦将 name 指向字符串文字,就会发生崩溃和/或堆损坏。

正如 japreiss 在评论中指出的那样,执行 约定的一个好方法是编写专用函数,例如:

void initialize_test(test *obj, const char *name, char *class, char *rollno) {
obj->name = strdup(name);
...
}
void destroy_test(test *obj) {
free(obj->name);
}
test *malloc_test(const char *name, ...) {
test *obj = malloc(sizeof(*obj));
initialize_test(obj, name, ...);
return test;
}
void free_test(test *obj) {
destroy_test(obj);
free(obj);
}

关于c - 使用结构指针访问 C 中的结构成员时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17111895/

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