2014-03-12 168 views
1

我來自Java背景,並試圖更好地理解C結構,指針和數組。下面是我在擺弄示例代碼:在C結構中引用數組

如果以下工作:

#include <stdio.h> 

int main(void) { 
    char string[] = "Hello"; 
    printf("%c",string[0]); 
    return 0; 
} 

爲什麼有錯誤以下的回報?

#include <stdio.h> 

int main(void) { 
    typedef struct{ 
     int x; 
     char string[8]; 
    }ST_DATA; 

    ST_DATA *my_data; 
    my_data->x = 100; 
    my_data->string = "Hello"; // issues a warning, described below 

    printf("%d",my_data->x); // works fine 
    printf("%c",my_data->string[0]); 
    return 0; 
} 

下面是我得到的錯誤:

編譯錯誤時間:0記憶:2292信號:0

prog.c中:在函數 '主':

PROG .c:12:18:錯誤:從類型'char *'分配類型'char [8]'時的不兼容類型「

my_data-> string =」Hello「;

我有以下改動嘗試,以及:

一)

my_data->string[] = "Hello"; 

這將會給我下面的錯誤:

prog.c中:在函數 '主':

prog.c:12:18:錯誤:''''令牌之前的預期表達式

my_data-> string [] =「Hello」;

  ^

B)

my_data->string[8] = "Hello"; 

此方法返回運行時錯誤。據推測,當我打印第一個字符時會發生錯誤。

必須有一些我正在做或期望的東西(用於使用C以外的其他語言編碼),但我似乎無法弄清楚爲什麼會發生這種情況以及如何使其工作。我非常感謝任何指針(哈!明白了嗎?)

+0

它應該是strcpy(my_data-> string,「Hello」;) – michaeltang

+0

瞭解。謝謝!儘管如此,它爲什麼會在第一個代碼片段中工作。我本質上是試圖做同樣的事情,只是這次,數組在結構中。那是什麼令我困惑 –

+0

@ swap_1712請在下面檢查我的答案以清除您的困惑。希望你現在明白。 –

回答

3

在第一種情況下,您將自動爲內存分配char string[] = "Hello"。編譯器會在這裏處理內存管理。

第二,my_data是一個指針,你需要手動分配內存給它,然後給它分配一些東西。

您可以:

ST_DATA *my_data = (ST_DATA *)malloc(sizeof(ST_DATA)); 

這會是很好的你花一些時間閱讀有關自動內存分配和動態內存分配。

1

strcpy()需要使用到的字符串複製到結構ST_DATA的字符串成員。

strcpy(my_data->string, "Hello");

之前,你必須爲你的結構分配內存,

ST_DATA *my_data = (ST_DATA *) malloc(sizeof(ST_DATA));

編輯:內部主要結構ST_DATA()僅僅是一個聲明,告訴編譯器,它的成員他們是什麼類型。如何在分配內存之前使用它。你可以認爲ST_DATA的數據類型與int等其他類型的數據類型相似,當它們沒有被定義爲int object時,這些數據類型獲取的內存爲i

0
ST_DATA *my_data; 
my_data->x = 100; 

這裏my_data是一個指針,所以先給它分配內存。

char string[] = "Hello"; 

這裏字符串賦值與聲明所以它如果罰款。但在下面的代碼

my_data->string = "Hello"; 

是不好的,因爲初始化只能用聲明來完成。在聲明字符串值後必須使用strcpy()

+0

謝謝!儘管這部分代碼似乎在工作。我已經能夠打印整數的值了。只是不是字符串。對於我所嘗試的,我補充了更多解釋。再次感謝。 –