2012-03-31 24 views
0

我使用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. 

这个错误味精并没有真正意义的我...这是否曾想到你的人?请让我知道它为什么给我这个错误消息。提前致谢。

+2

切向注意:Visual Studio 6已经有14年了,所以在支持C++的新特性方面已经严重过时了。我建议你升级到一些现代化的东西(Visual Studio 2010 Express是免费的,并且14年以上是最新的!)。 – 2012-03-31 16:00:18

+0

@OliverCharlesworth这是一个C问题(VC++ 6有一个C编译器和一个C++编译器)。我们可以告诉他他正在使用C,因为他没有得到编译器错误,因为没有投出malloc!但升级编译器当然是一个好主意,特别是考虑到最近版本的VS Express是免费的。 – 2014-12-08 04:14:40

回答

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, [...]) 
+0

谢谢,我只是意识到我犯了一个错误的尝试以错误的方式初始化字符串。正确的方法应该是strcpy(variable_name,“String”) – shanwu 2012-04-01 13:25:51

1

在标准C中,= {}语法支持初始化,而不用于初始化后分配。使用循环逐个元素复制到(*ppl_ptr)

1

在C90中,您不能在作业中使用{ };仅在初始化时(即,当您声明变量时,在同一命令中向变量提供初始值时)。

在C99中,您可以编写(*ppl_ptr)=(people){"bla","bla","bla",192,58};,但VC++ 6.0太老,无法支持。

你可以做的是使用初始化使另一个变量,然后使用=复制:

people x = {"bla","bla","bla",192,58}; 
*ppl_ptr = x; 
1

一些提示:
1.始终intialize一个ponter为null,否则它可能contian垃圾值,如果在不知情访问可能会导致问题。

people *ppl_ptr = NULL; 

2. (*ppl_ptr).first_name="bla";
a)用的malloc,50字符的空间已经被分配给它。所以如果你用“bla”的地址替换它,你会导致内存泄漏。幸运的是,你有l值错误来避免这个问题。
b)Lvalue是一个表达式,它可以出现在等号的左侧,即可以赋值的东西。