我来自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-&gt; string =“Hello”;
我也尝试了以下更改:
A)
my_data->string[] = "Hello";
这会给我以下错误:
prog.c:在函数'main'中:
prog.c:12:18:错误:']'标记之前的预期表达式
my_data-&gt; string [] =“Hello”;
^
b)中
my_data->string[8] = "Hello";
返回运行时错误。据推测,当我打印第一个字符时会发生错误。
我一直在做或期待一些愚蠢的事情(习惯用C语言以外的其他语言进行编码),但我似乎无法弄清楚为什么会发生这种情况以及如何让它发挥作用。我非常感谢任何指针(哈!搞定它?)
答案 0 :(得分:3)
在第一种情况下,您将自动为char string[] = "Hello"
分配内存。编译器在这里负责内存管理。
在第二个中,my_data
是一个指针,您需要在为其分配内容之前手动分配内存。
你可以:
ST_DATA *my_data = (ST_DATA *)malloc(sizeof(ST_DATA));
花一些时间阅读有关自动内存分配和动态内存分配的信息会很好。
答案 1 :(得分:1)
strcpy()将字符串复制到结构ST_DATA
的字符串成员中。
strcpy(my_data->string, "Hello");
在为结构分配内存之前,
ST_DATA *my_data = (ST_DATA *) malloc(sizeof(ST_DATA));
编辑:main()中的结构ST_DATA
只是一个声明,它告诉编译器它具有它们是什么类型的成员。在分配内存之前,如何使用它。您可以将ST_DATA
视为与int
等类似于任何其他数据类型的数据类型,当它们未被定义为int object
获取i
的内存时没有任何意义。
答案 2 :(得分:0)
ST_DATA *my_data;
my_data->x = 100;
这里my_data是一个指针,所以首先为它分配内存。
char string[] = "Hello";
这里字符串是赋值声明,所以如果罚款。但是在下一个代码中
my_data->string = "Hello";
不正常,因为初始化只能通过声明来完成。必须使用strcpy()