2012-03-31 26 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是一個表達式,它可以出現在等號的左側,即可以賦值的東西。