[英]Referring an array inside a C structure
我來自Java背景,試圖更好地理解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:在函數“ main”中:
prog.c:12:18:錯誤:從類型'char *'分配給類型'char [8]'時類型不兼容
my_data-> string =“你好”;
我也嘗試了以下更改:
一種)
my_data->string[] = "Hello";
這將給我以下錯誤:
prog.c:在函數“ main”中:
prog.c:12:18:錯誤:“]”標記之前的預期表達式
my_data-> string [] =“你好”;
^
b)
my_data->string[8] = "Hello";
這將返回運行時錯誤。 據推測,當我打印第一個字符時會發生錯誤。
我肯定在做或期望做一些愚蠢的事情(習慣於使用C以外的其他語言進行編碼),但是我似乎無法弄清為什么會發生這種情況以及如何使其工作。 我將不勝感激任何指針 (哈!明白嗎?)
在第一種情況下,您將自動為char string[] = "Hello"
分配內存。 編譯器在這里負責內存管理。
在第二個中, my_data
是一個指針,您需要在為其分配內容之前手動為其分配內存。
您可以:
ST_DATA *my_data = (ST_DATA *)malloc(sizeof(ST_DATA));
最好花一些時間閱讀有關自動內存分配和動態內存分配的信息。
需要使用strcpy()將字符串復制到結構ST_DATA
字符串成員中。
strcpy(my_data->string, "Hello");
在必須為結構分配內存之前,
ST_DATA *my_data = (ST_DATA *) malloc(sizeof(ST_DATA));
編輯:main()中的ST_DATA
結構只是一個聲明,它告訴編譯器它具有其類型的成員。 在分配了內存之前如何使用它。 您可以將ST_DATA
視為類似於int
等任何其他數據類型的數據類型,當未將它們定義為為i
獲取內存的int object
時,它們沒有任何意義。
ST_DATA *my_data;
my_data->x = 100;
這里的my_data是一個指針,因此首先要為其分配內存。
char string[] = "Hello";
這里為字符串分配了帶有聲明的值,因此可以。 但是在下一個代碼中
my_data->string = "Hello";
這不是好的,因為初始化只能通過聲明來完成。 在聲明字符串值之后,必須使用strcpy()
進行賦值
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.