我使用visual C ++ 6.0练习指针人员,以下是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char first_name[50];
char middle_name[50];
char last_name[50];
int height;
int weight;
}people;
int main()
{
//declare a people structure pointer
people *ppl_ptr;
//allocate memory space for people structure
ppl_ptr = malloc(sizeof(people));
//check if you run out of the heap
if(ppl_ptr==NULL)
{
printf("Out of memory!\n");
return 0;
}
//initialize the unname people varible
(*ppl_ptr)={"bla","bla","bla",192,58};
return 0;
}
但是我遇到了语法错误:
C:\C Practice\ch14.c(30) : error C2059: syntax error : '{'
Error executing cl.exe.
如果我更换
(*ppl_ptr)={"bla","bla","bla",192,58};
(*ppl_ptr).first_name="bla";
我会得到一个不同的错误:
ch14.c
C:\C Practice\ch14.c(30) : error C2106: '=' : left operand must be l-value
Error executing cl.exe.
这个错误消息对我来说真的没有意义......这对你们任何人都有过吗?请让我知道为什么它给我这个错误消息。提前致谢。
答案 0 :(得分:2)
尝试正确访问结构:
char* bla_str_ptr = "bla";
[...]
strcpy(ppl_ptr->first_name, bla_str_ptr);
strcpy(ppl_ptr->middle_name, bla_str_ptr);
ppl_ptr->height = 123;
[...]
您还可以使用此签名编写初始化函数:
void ppl_init(char* first_name, char* middle_name, [...])
答案 1 :(得分:1)
在标准C中,= {}
语法仅支持初始化,而不支持初始化后的分配。使用循环逐个元素地复制到(*ppl_ptr)
。
答案 2 :(得分:1)
在C90中,您无法在作业中使用{ }
;仅在初始化时(即在向声明变量的同一命令中向变量提供初始值时)。
在C99中,您可以编写(*ppl_ptr)=(people){"bla","bla","bla",192,58};
,但VC ++ 6.0太旧而无法支持。
您可以做的是使用初始化创建另一个变量,然后使用=
复制:
people x = {"bla","bla","bla",192,58};
*ppl_ptr = x;
答案 3 :(得分:1)
一些提示:
1.总是将一个ponter初始化为null,否则它可能会导致垃圾值,如果在不知情的情况下访问它可能会导致问题。
people *ppl_ptr = NULL;
2。 (*ppl_ptr).first_name="bla";
a)使用malloc,已经为其分配了50个字符空间。因此,如果将其替换为“bla”的地址,则会导致内存泄漏。幸运的是,您有l值错误以避免此类问题
b)左值是一个表达式,可以出现在等号的左侧,即可以赋值的东西。