请教C语言结构体中指针的问题

#C语言结构体中指针的问题

typedef struct person{
    int age;
    int* num;    
}person;

int a=10;
person C={20,&a};//这里有错误

最后一句代码出错,报错expression must have a constant value
请问为什么这个属性(int* num)不能这样初始化?

在结构体定义中,可以使用常量表达式初始化成员,但不能使用变量,因为在编译时无法确定变量的值。对于指针类型的成员,初始化时必须为其分配一个内存空间。因此,可以改为以下方式初始化:

person C = {20, NULL};
C.num = &a;

首先将num初始化为NULL,然后再将变量a的地址赋给它。

在C语言中,结构体的初始化必须在编译时确定,不能使用变量作为初始化值。可以考虑这样写:

int a = 10;
person C;
C.age = 20;
C.num = &a;

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据您提供的代码,您定义了一个结构体 person,其中包含一个 int 类型的成员变量 age 和一个 int 类型的指针成员变量 num。然后,您尝试用一个变量 a 的地址对 num 进行初始化,但是编译器报告了一个错误 "expression must have a constant value"。这是因为在 C 语言中,当您在结构体的定义中初始化指针成员变量时,必须使用常量表达式来初始化它。在您的代码中,您使用了一个变量 a 的地址来初始化 num,而 a 不是一个常量,因此编译器报告了一个错误。

要解决这个问题,您可以将指针成员变量的初始化分开进行。例如,您可以先定义结构体变量,然后再将指针成员变量初始化为变量的地址,如下所示:
在下面的代码中,我们首先将 num 初始化为 NULL,然后将其赋值为变量 a 的地址。这样就可以避免编译器报告错误。

int a = 10;
person C = {20, NULL}; // 将指针成员变量初始化为 NULL

C.num = &a; // 然后将指针成员变量初始化为变量的地址

下面的代码中,我们首先将 num 初始化为 NULL,然后将其赋值为变量 a 的地址,这样就可以避免编译器报告错误。同时,我们在 main 函数中定义了变量 a,以便在对 num 进行初始化时使用它的地址。完整的代码可以按照以下方式修改:

int main() {
    int a = 10;
    person C = {20, NULL}; // 将指针成员变量初始化为 NULL

    C.num = &a; // 然后将指针成员变量初始化为变量的地址

    return 0;
}

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

这么定义C 且初始化,没有问题啊:

#include <stdio.h>
typedef struct person {
    int age;
    int* num;
}person;

int a = 10;
person C = { 20,&a };//这里有错误 ??
 
int main()
{
    printf("%d,%p %p %d", C.age, &a, C.num, *C.num);
    return 0;
}