c - 在 C 中传递结构的一部分

标签 c arrays function char structure

我有一个这样声明的结构:

typedef struct {
    char InstrumentDB[128];
    char GeneralSettingsDB[128];
    char LiveDB[128];
    char SystemsDB[128];
} Address;

但是,当我尝试调用函数 OpenDatabase(char* filepath, ...) 时,出现错误。我这样调用它:

OpenDatabase(Filepath.InstrumentDB, db);

但是,当我创建一个相同大小的新 char 数组但在一个单独的变量中而不归因于它工作的结构时?为什么是这样?他们肯定是同一种类型吧?

编辑:Filepath.InstrumentDB 声明如下:

Address Filepath;
Filepath.InstrumentDB = "/root/BBBTest/Instruments.db";

这是我得到的错误:error: incompatible types when assigning to type ‘char[128]’ from type ‘char *’

最佳答案

无效初始化

您的代码无效:

Address Filepath;
Filepath.InstrumentDB = "/root/BBBTest/Instruments.db";

如果我用一个最小的例子来尝试这个,我会在 LLVM 7.3 中得到这个错误:

~/tmp> gcc -Wall -pedantic -ansi test.c
test.c:19:24: error: array type 'char [128]' is not assignable
  address.InstrumentDB = "/root/BBBTest/Instruments.db";
  ~~~~~~~~~~~~~~~~~~~~ ^

您正在尝试覆盖静态初始值设定项。 InstrumentDB 字段的内存在您创建结构时已经分配。相反,只需复制您需要的数据即可重复使用它。

工作最少的例子

使用动态副本

这按预期工作:

#include <stdio.h>
#include <string.h>


typedef struct {
  char InstrumentDB[128];
} Address;

void OpenDatabase(char* filepath) {
  /* do stuff */
  printf("%s\n", filepath);
}


int main(int ac, char **av) {
  Address address;
  strcpy(address.InstrumentDB, "test");
  OpenDatabase(address.InstrumentDB);
}

关于字符串复制操作的快速说明:

C 字符串按照约定以 null 结尾。请注意,在上面的示例中,为了简单起见,我使用了 strcpy() 函数。但是,如果您的输入字符串来自非静态源(即任何类型的 I/O,如用户输入、文件输入等),而不是空终止的,或者您的软件构建方式可能允许修改预期目的,你要防范buffer overflow/overrun使用显式复制操作(例如 strncpystrlcpy/lstrcpy,具体取决于目标环境)的错误。

感谢用户 StoryTeller 和 iwin 指出这一点。

静态初始化

用这个替换上面示例中的初始化行也可以:

int main(int ac, char **av) {
  Address address = {
    "test2"
  };
  OpenDatabase(address.InstrumentDB);
}

关于c - 在 C 中传递结构的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38869164/

相关文章:

python - 如何将类呈现为函数?

javascript - 根据另一个 Div 的存在调整一个 Div 的样式?

c - 我如何在 GTK+ 中使用 GtkPlug/GtkSocket

c - 指针增量与整数增量不同?

c - ( C ) 在 ASCII 图表中向前步进 x 次但仍保持在 a-z 之间的最佳方法?

javascript - 使用javascript将数组值添加到 map 中?

ios - Array.contains(其中 :) to return Array item that returned true

c - 使用 GDB 调试进程

java - 用奇数填充二维数组java

Javascript:允许作为参数传递的对象方法访问公共(public)方法