2014-03-12 142 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

谢谢!尽管这部分代码似乎在工作。我已经能够打印整数的值了。只是不是字符串。对于我所尝试的,我补充了更多解释。再次感谢。 –