【发布时间】:2021-01-04 23:34:10
【问题描述】:
所以我仍然对与结构相关的指针有点困惑。
我有一个代表队列的结构。该队列包含一个队列元素数组 (containers)。
我现在想访问这些容器以便为它们分配值。此代码仅供containers[0] 使用,以保持简单。
从writeContainer()函数返回后,如何访问main中containers[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(&testq, mainArray, 6);并更改int writeContainer(myq *anyq, void *buf, int buflen)以便传递testq的地址 -
如果你被允许修改结构定义,你可以使用另一种不会让你的灵魂如此痛苦的技巧。
-
除非您可以更改
writeContainer的签名,否则问题几乎是不可能的。您对anyq所做的任何更改都不会反映给调用者。因此,它[有效地]使该功能成为无操作。请重新访问原始问题陈述以验证您是否具有正确的函数签名和正确的typedef,因为我相信您需要myq *anyq才能有意义[或者,正如 chqlie 提到的typedef应该是一个指针]。如果问题真的需要 [by value] 参数,那么问题就解决了。