[英]Not able to obtain struct after passing in struct pointer
我在函數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;
//函數生成
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 ();
您在generate
函數中犯了一個初學者錯誤。 您必須記住,在C語言中,所有參數都是按值傳遞的,這意味着它們的值將被復制到函數內部的局部變量中。 這意味着,當您在generate
函數中分配給q
時,僅分配本地副本。 您在調用generate
函數時傳遞的參數將不會被修改。
此外,你需要檢查你的設計,因為在query
您首先進行q
點&qHolder
,那么你覆蓋指針與調用malloc
, 和你調用malloc
一次內部generate
。 因此,您只需將指針設置一次就可以設置三次。
而且我想知道如何編譯而不會讓編譯器大喊大叫,因為q
不是 object
結構。
您的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");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.