[英]Passing struct to a function to assign values
我試圖將結構傳遞給駐留在單獨文件中的函數。 當將結構作為參數傳遞時,它將引發錯誤。
TEST.C
struct student{
int rollNumber;
unsigned char name[20];
int marks;
};
void func(struct student devanshu);
int main(){
struct student devanshu;
func(&devanshu);
printf("--------------------%d\n", devanshu.rollNumber);
printf("--------------------%d\n", devanshu.marks);
printf("--------------------%s\n", devanshu.name);
}
NewTest.c:
void func(struct student devanshu)
{
devanshu.rollNumber = 1;
devanshu.marks = 909;
strcpy(devanshu.name, "abc.xyz");
return;
}
這是我得到的輸出:
In file included from test.c:6:0:
newtest.c:10:30: error: parameter 1 (‘devanshu’) has incomplete type
void func(struct student devanshu)
test.c: In function ‘main’:
test.c:23:7: error: incompatible type for argument 1 of ‘func’
func(&devanshu);
^
In file included from test.c:6:0:
newtest.c:10:6: note: expected ‘struct student’ but argument is of type ‘struct student *’
void func(struct student devanshu)
newtest.c:10:30: error: parameter 1 (‘devanshu’) has incomplete type
void func(struct student devanshu)
newtest.c:7:20: error: storage size of ‘devanshu’ isn’t known
struct student devanshu;
如果我在同一文件(即在test.c
使用該函數,則不會引發任何錯誤,並且工作正常。 但是,當將函數保存在兩個不同的文件中時,會出現這些錯誤。
如果有人可以幫助我度過難關,將不勝感激。 提前致謝。
錯誤:參數1('devanshu')的類型不完整
這意味着結構定義對於您在其中使用的文件不可見。 除非故意這樣做,否則您需要將結構定義放在頭文件中,並使用該結構在每個.c文件中都包括該定義。
預期的“結構學生”,但參數的類型為“結構學生*”
您編寫的功能不正確。 它應該是void func(struct student* devanshu);
在函數內部,您應該使用devanshu-> ...
訪問成員。 否則,您只需將結構的副本傳遞給函數,然后更改本地副本。
錯誤是不言自明的。 拿這個:
test.c:在函數“ main”中:
test.c:23:7:錯誤:“ func”的參數1的類型不兼容
FUNC(&devanshu);
這意味着您要向func
傳遞某種與您告訴編譯器func接受的類型不同的類型的東西。 您已聲明接受struct student
的功能
void func(struct student devanshu);
但是函數調用傳遞了一個指向struct student
的指針。
func(&devanshu);
函數調用是正確的,因為您希望函數可以訪問要傳遞的結構而不是副本。 因此,您需要更改功能以采用struct student *
。
其他錯誤是因為您沒有使用包含文件來存儲struct
的定義。
創建一個名為“ student.h”(或其他名稱)的文件,並將結構的定義移入其中。 還有函數的聲明。
struct student{
int rollNumber;
unsigned char name[20];
int marks;
};
void func(struct student *);
並且放在兩個C文件的頂部
#include "student.h"
它告訴編譯器在編譯時將文件的內容復制到C文件中。 這意味着您有一個一致的定義,可以由需要它的所有文件共享。
好的,這將起作用:(下面的解釋)
test.h :(新文件!)
struct student{
int rollNumber;
char name[20];
int marks;
};
test.c的:
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
void func(struct student *devanshu);
int main(){
struct student devanshu;
func(&devanshu);
printf("--------------------%d\n", devanshu.rollNumber);
printf("--------------------%d\n", devanshu.marks);
printf("--------------------%s\n", devanshu.name);
}
NewTest.c:
#include <string.h>
#include "test.h"
void func(struct student *devanshu)
{
devanshu->rollNumber = 1;
devanshu->marks = 909;
strcpy(devanshu->name, "abc.xyz");
return;
}
這個
unsigned char name[20];
稍后會在strcpy()上給您帶來問題。 更改為char。
這個
void func(struct student devanshu);
沒錯,但是您陷入了陷阱。 C語言中的結構始終按整個結構的值(副本)傳遞。 因此,如果您希望func()修改原始結構,則必須明確地告訴它:
void func(struct student *devanshu);
然后,在func中,您需要將訪問語法更改為使用->操作符代替'。
在兩個文件中都使用struct學生時,需要將struct的聲明移到頭文件中。 您可以(就像我在第一次編輯時所做的那樣)也重復聲明,因為我很懶,但是注釋100%是正確的:這是非常危險的做法,所以我更改了它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.