引用C结构内的数组

时间:2014-03-12 15:50:06

标签: c arrays pointers 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-&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语言以外的其他语言进行编码),但我似乎无法弄清楚为什么会发生这种情况以及如何让它发挥作用。我非常感谢任何指针(哈!搞定它?)

3 个答案:

答案 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()

分配字符串值声明后