我在函数query
中遇到错误。它没有返回结果。
函数generate
初始化结果。它由函数query
调用。
//定义结构
#define MAX 50
typedef struct {
char I[50];
char name[10];
} object;
typedef struct {
int num_items;
object items[MAX];
} arg_t;
// function generate
void generate (object *q) {
// initialize
object objectArray[] = {
{
.I = "1",
.name = "John"
}, // item 1
{
.I = "2",
.name = "Jane"
}, // item 2
};
q = malloc(sizeof(arg_t));
q->num_items = 2;
printf("There are %d of elements in the record.\n", q->num_items);
memcpy(q->items, object, sizeof(object) * q->num_items);
int i =0;
for (i=0; i < q->num_items ;i++) {
printf("option: %s \n", q->items[i].I);
printf("option: %s \n", q->items[i].name);
}
printf("Leaving Generate()\n");
}
//函数查询
void query () {
arg_t qHolder;
arg_t *q = &qHolder; // give the pointer an address
q = malloc(sizeof(arg_t));
generate (q);
printf("There are %d of elements in the record.\n", qHolder.num_items); // <b> This line is wrong. It is giving 0 instead of 2. </b>
// There is no compiler error. It just does not print when it runs after the follwing line
int i =0;
for (i=0; i < q->num_items;i++) {
printf("option: %s \n", qHolder.items[i].I);
printf("option: %s \n", qHolder.items[i].name);
}
printf("Leaving Query()\n");
}
在main()
中 query ();
答案 0 :(得分:1)
您在generate
功能中犯了初学者错误。您必须记住,在C中,所有参数都是按值传递的,这意味着它们的值被复制到函数内的局部变量中。这意味着当您在q
函数内分配generate
时,您只需指定本地副本。调用generate
函数时传递的参数不会被修改。
此外,您需要检查您的设计,因为在query
中您首先q
指向&qHolder
,然后您覆盖指针与您的通话至malloc
,和,您在malloc
内再次致电generate
。所以你设置指针三次,只有其中一个就足够了。
我想知道如果没有编译器对你大喊大叫,这会编译,因为q
不是 object
结构。
答案 1 :(得分:1)
您的generate()
函数采用object *q
参数,但它首先要做的是通过将malloc()
的结果赋给它来覆盖指针的值。不要那样做,因为调用者告诉你在哪里存储object
,所以不需要分配新的内存。
这是一个固定版本:
void generate (object *q) {
// initialize
const object objectArray[] = {
{
.I = "1",
.name = "John"
}, // item 1
{
.I = "2",
.name = "Jane"
}, // item 2
};
q->num_items = sizeof objectArray / sizeof *objectArray;
printf("There are %d of elements in the record.\n", q->num_items);
memcpy(q->items, objectArray, sizeof objectArray);
for (int i = 0; i < q->num_items; ++i) {
printf("option: %s\n", q->items[i].I);
printf("option: %s\n", q->items[i].name);
}
printf("Leaving generate()\n");
}
然后在query()
中,您再次通过调用malloc()
来覆盖指针。我想你需要了解基础知识。
这是一个固定版本:
void query (void) {
arg_t qHolder;
generate (&qHolder);
printf("There are %d of elements in the record.\n", qHolder.num_items);
for (int i = 0; i < q->num_items; ++i) {
printf("option: %s \n", Holder.items[i].I);
printf("option: %s \n", qHolder.items[i].name);
}
printf("Leaving query()\n");
}