【问题标题】:How do I keep information in struct after returning from function?从函数返回后如何将信息保存在结构中?
【发布时间】:2021-01-04 23:34:10
【问题描述】:

所以我仍然对与结构相关的指针有点困惑。 我有一个代表队列的结构。该队列包含一个队列元素数组 (containers)。 我现在想访问这些容器以便为它们分配值。此代码仅供containers[0] 使用,以保持简单。

writeContainer()函数返回后,如何访问maincontainers[0]的字符串?

writeContainer() 的签名已经给出,所以我无法更改。

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

typedef struct qElement {
    char array[55];
    int len;
} container;

typedef struct queue {
    container containers[5];
    int id;
} myq;

int writeContainer(myq anyq, void *buf, int buflen);

int main(void) {
    myq *testq = malloc(sizeof(myq));
    char *mainArray = "hello";

    writeContainer(*testq, mainArray, 6);

    printf("outside Array[0]: %s\n", testq->containers[0].array);
    return EXIT_SUCCESS;
}

int writeContainer(myq anyq, void *buf, int buflen) {
    container *elem = malloc(sizeof(container));

    // into temp elemnt
    elem->len = buflen;
    memcpy(&elem->array, buf, buflen);

    // into actual queue
    memcpy(&anyq.containers[0], elem, buflen);
    printf("qArray[0]: %s\n", &anyq.containers[0].array);
    printf("exiting function\n");
    free(elem);
    return buflen;
}

所以输出是:

qArray[0]: hello
exiting function
outside Array[0]: 

但我期待:

qArray[0]: hello
exiting function
outside Array[0]: hello

提前致谢

【问题讨论】:

  • doSth 中,您正在修改本地副本。您需要将签名更改为int doSth(myq *anyq, void *buf, int buflen); 并传递testq。 (以及其他需要的更改。)
  • C 是按值传递,而不是按引用传递。但是writeContainer 需要void *,因此您可以在类型系统中任意打孔。例如,传递一个指向结构的指针,其中一个成员是您尝试修改的值的地址
  • 你不需要分配到writeContainer() 你也不需要分配到main()。这很可能是你的困惑来自哪里。只需声明myq testq;所有成员都已经有自动存储。然后调用writeContainer(&amp;testq, mainArray, 6); 并更改int writeContainer(myq *anyq, void *buf, int buflen) 以便传递testq 的地址
  • 如果你被允许修改结构定义,你可以使用另一种不会让你的灵魂如此痛苦的技巧。
  • 除非您可以更改writeContainer 的签名,否则问题几乎是不可能的。您对anyq 所做的任何更改都不会反映给调用者。因此,它[有效地]使该功能成为无操作。请重新访问原始问题陈述以验证您是否具有正确的函数签名和正确的typedef,因为我相信您需要myq *anyq 才能有意义[或者,正如 chqlie 提到的typedef应该是一个指针]。如果问题真的需要 [by value] 参数,那么问题就解决了。

标签: c pointers struct


【解决方案1】:

有了这个writeContainer的原型:

int writeContainer(myq anyq, void *buf, int buflen);

以及myqwriteContainer 的发布定义不能写入对从main() 传递的队列产生副作用,因为它是按值传递的。原型在另一方面是不一致的:如果来自buf 的数据只应该被读取并复制到容器中,则该指针应声明为const void *buf,其大小应作为size_t buflen 传递。

原型中或myqtypedef 中缺少*

【讨论】:

  • 感谢@chqrlie。 myq 缺少的 * 是解决方案。现在完全有意义,因为它是一个包含多个元素的队列。
猜你喜欢
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 2016-03-25
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多