gpt4 book ai didi

C. 正确处理指向函数的双指针,该函数分配一个结构并返回指向它的指针——在不同的函数中读取、显示、释放

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

当我在“main”函数中动态分配内存时,程序运行良好。现在我想在“读”函数中分配,但每次尝试都惨败。

我认为我的问题出在我的“main”函数中:我无法弄清楚如何从函数“read”中检索结构(指针),然后通过函数“destroy”释放它动态分配的内存。

int main(void)
{
int err_code;
struct student_t** s=(struct student_t**)malloc(1024*sizeof(struct student_t*));
**s = &read(err_code); //here is: error: lvalue required as unary '&' operand.
//But I think that my problem is wider than just this error.

if (s==NULL) {
puts("Error\n");
}

display(s);
destroy(s);

return err_code;
}


我试图做的:创建一个结构类型的指针,指向由“read”函数返回的结构指针。然后将此**指针传递给“destroy”函数,以释放分配的内存。

函数。
在“读取”功能中,用户插入分配给结构的数据。返回指向动态分配结构的指针,如果有任何错误,则返回 NULL。

struct student_t* read(int *err_code)
{ printf("Insert data:\n");
struct student_t* p = (struct student_t *)malloc(1024*sizeof(struct student_t));
*err_code=1;
if (p==NULL) {
puts("Error\n");
return NULL;
}
//then it's supposed to read from user and assing to struct. Code below in links.
}


struct student_t {
char name[20];
char surname[40];
int index;
};


函数释放动态分配的内存,除非“读取”失败并返回 NULL。

void destroy(struct student_t **s)
{
if (s!=NULL) free(s);
}


我的显示功能。但我认为我的问题开始得更早。

void display(const struct student_t **s) //here I'm unsure if it should be *s- or **s-function.
{
if(s!=NULL) printf("%s %s, %i\n", (*s)->name, (*s)->surname, (*s)->index);
}

我的“阅读”功能基于我之前问题的答案。当我在“main”中正确分配内存时它会起作用。我使用的“读取”代码:How to detect if user inserts data with commas (in a desired format) or not?其他更简单的“读取”,我无法正确处理我想要的所有错误:How to scanf commas, but with commas not assigned to a structure? C

我真的很感谢所有的帮助,一切都像是对我 150 个小时的救赎 努力完成一项任务。

最佳答案

您有两个错误:

  1. 你问这个问题是因为你做错了。函数返回的值是所谓的r-value。之所以如此命名,是因为它只能位于作业的右侧。它比这更复杂一些,但是右值或左值(您可以分配给左手边的东西)的常见测试是如果它的地址可以用地址运算符&获取。 R 值不能有地址。

    这个问题的(简单)解决方案很简单:

    *s = read(err_code);
  2. 第二个错误是因为 read 需要一个指向 int 的指针作为其参数,而您传递的是一个普通的 int 变量。在这里您应该使用address-of运算符:

    *s = read(&err_code);
<小时/>

还有一些其他问题,最大的问题是需要 s 成为指向指针的指针。难道就只是一个单指针,然后简单地做

    struct student_t *s = read(&err_code);

另一个问题是,在许多系统中可能已经存在一个现有的 read 函数(尤其是 Linux 和 macOS 等 POSIX 系统),因此该函数的声明会发生冲突。

关于C. 正确处理指向函数的双指针,该函数分配一个结构并返回指向它的指针——在不同的函数中读取、显示、释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51937965/

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