我创建了一个类型并尝试更改其中的 int 值。但是它一直打印240。我不知道为什么,有人可以帮我吗?这是我的代码:
typedef struct{
int i;
}MyType;
do(MyType mt, int ii){
mt.i = ii;
}
int main(int argc, char ** argv){
MyType mt;
do(mt, 5);
print("%d\n", mt.i);
}
按值传递mt
给函数do()
。所做的任何更改都将是该函数的本地更改。传递地址mt
:
void do_func(MtType* mt, int ii){
mt->i = ii;
}
MyType mt;
do_func(&mt, 5);
所以首先,你的do
功能有一些问题。您未能指定返回类型,因此假定为 int(C99 之前),但我认为没有理由不只指定它。其次,do
是 C 中的保留关键字。
您正在按值传递结构,因此会制作一个副本,将其传递给您的do
函数,然后对其进行修改。在 C 中,所有内容都是按值传递的,句号。您mt
声明的变量main
永远不会被触及。
MyType*
如果您需要修改其一个或多个成员变量,请在代码中使用 a,MyType**
如果您需要为结构本身分配内存(即初始化指针),请使用 a。
// pass a pointer to the function to allow
// for changes to the member variables to be
// visible to callers of your code.
void init_mytype(MyType *mt, int ii){
if(mt)
mt->i = ii;
}
MyType mt;
init_mytype(&mt, 1);
// pass a pointer to pointer to initialize memory
// for the structure and return a valid pointer.
// remember, everything is passed by value (copy)
void init_mytype(MyType **mt, int ii) {
if(mt) {
*mt = malloc(sizeof(MyType));
if(*mt)
(*mt)->i = ii;
}
}
MyType *pmt;
init_mytype(&pmt, 1);