【问题标题】:Referring an array inside a C structure在 C 结构中引用数组
【发布时间】:2014-03-12 15:50:06
【问题描述】:

我来自 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 = "你好";

我也尝试了以下更改:

a)

my_data->string[] = "Hello";

这会给我以下错误:

prog.c:在函数“main”中:

prog.c:12:18: 错误:']' 标记之前的预期表达式

my_data->string[] = "你好";

              ^

b)

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

这会返回运行时错误。大概是我打印第一个字符时发生的错误。

一定有一些愚蠢的事情我正在做或期待(习惯于使用除 C 之外的其他语言进行编码),但我似乎无法弄清楚为什么会发生这种情况以及如何让它发挥作用。我非常感谢任何指针(哈!明白了吗?)

【问题讨论】:

  • 应该是 strcpy(my_data->string,"Hello";)
  • 明白。谢谢!虽然,为什么它在第一个代码 sn-p 中起作用。我本质上是在尝试做同样的事情,只是这一次,数组位于结构内部。这就是让我困惑的地方
  • @swap_1712 检查下面我的答案以消除您的困惑。希望你现在明白了。

标签: c arrays pointers structure


【解决方案1】:

在第一种情况下,您会自动为char string[] = "Hello" 分配内存。编译器在这里负责内存管理。

在第二个中,my_data 是一个指针,您需要手动为其分配内存,然后再为其分配内存。

你可以:

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

您最好花一些时间阅读有关自动内存分配和动态内存分配的信息。

【讨论】:

    【解决方案2】:

    strcpy() 需要用于将字符串复制到结构ST_DATA 的字符串成员中。

    strcpy(my_data-&gt;string, "Hello");

    在你必须为你的结构分配内存之前,

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

    编辑:main() 中的结构 ST_DATA 只是一个声明,它告诉编译器它具有它们是什么类型的成员。在分配内存之前如何使用它。您可以将ST_DATA 视为类似于int 等任何其他数据类型的数据类型,当它们未定义为int object 时没有意义,它为i 获取内存。

    【讨论】:

      【解决方案3】:
      ST_DATA *my_data;
      my_data->x = 100;
      

      这里 my_data 是一个指针,所以首先给它分配内存。

      char string[] = "Hello";
      

      这里的字符串是用声明赋值的,所以如果没问题的话。但在下一个代码中

      my_data->string = "Hello";
      

      不行,因为初始化只能通过声明来完成。必须使用 strcpy() 分配字符串值后声明

      【讨论】:

      • 谢谢!虽然,这部分代码似乎正在工作。我已经能够很好地打印整数的值。只是不是字符串。我添加了一些关于我尝试过的更多解释。再次感谢。
      猜你喜欢
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      相关资源
      最近更新 更多