C语言中结构的传递部分

C语言中结构的传递部分,c,arrays,function,char,structure,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);

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

typedef struct {
    char InstrumentDB[128];
    char GeneralSettingsDB[128];
    char LiveDB[128];
    char SystemsDB[128];
} Address;
但是,当我尝试调用函数
OpenDatabase(char*filepath,…)
时,我得到一个错误。我这样称呼它:

OpenDatabase(Filepath.InstrumentDB, db);
但是,当我创建一个大小相同的新char数组,但它位于一个独立的变量中,而该变量不属于它工作的结构时?为什么会这样?他们肯定是同一类型的吗

EDIT:Filepath.InstrumentDB的声明如下:

Address Filepath;
Filepath.InstrumentDB = "/root/BBBTest/Instruments.db";
这就是我得到的错误:
错误:当从类型“char*”分配给类型“char[128]”时,类型不兼容。

初始化无效 您的代码无效:

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);
}
无效初始化 您的代码无效:

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);
}

无法将数组分配给。如果这样做,您将得到相同类型的错误

int main()
{
     char buf[10];
     buf = "Hello";
}
相反,您需要使用字符串函数

#include <string.h>
int main()
{
     char buf[10];
     strcpy(buf, "Hello");
}
#包括
int main()
{
char-buf[10];
strcpy(buf,“你好”);
}

更一般地说,您需要阅读C中的字符串。
之所以存在,是因为涉及字符串的大量操作(表示为
字符的数组)不能按预期的方式工作。

数组无法分配给。如果这样做,您将得到相同类型的错误

int main()
{
     char buf[10];
     buf = "Hello";
}
相反,您需要使用字符串函数

#include <string.h>
int main()
{
     char buf[10];
     strcpy(buf, "Hello");
}
#包括
int main()
{
char-buf[10];
strcpy(buf,“你好”);
}


更一般地说,您需要读取C中的字符串。
之所以存在,是因为涉及字符串的大量操作(表示为
字符的数组)不能按预期的方式工作。

“我收到一个错误”-什么错误?以及如何定义和初始化
Filepath
?请添加一个显示错误的最小示例(并将错误包含在您的问题中)。对于超最小示例,编译很好:。您的问题是什么。要复制字符串,您不能只分配它,而必须使用strcpy(Filepath.InstrumentDB,“…”)“我收到一个错误”-什么错误?以及
Filepath
是如何定义和初始化的?请添加一个显示错误的最小示例(并将错误包含在您的问题中)。对于一个超最小的示例编译很好:。您的问题是什么。要复制字符串,您不能只分配它,而必须使用strcpy(Filepath.InstrumentDB,“…”)可能应该使用
strncpy
而不是
strcpy
@haylem,因为结构定义可能隐藏在某些头中,当有人无意中更改了静态初始值设定项并忘记了计算字符数时。@StoryTeller:关于标准库,这是真的,我的错,它也不是POSIX的一部分。很抱歉正如我所说,我已经多年没有编写过C了,所以我只启动了一个emacs和编译器来快速运行。我更担心的是,我指出了我的知识差距,或者我的理解过时了。谢谢你纠正我。@StoryTeller:修改了答案以涵盖这一点,但保留了代码示例的简单形式。@iwin:修改。谢谢。也许应该使用
strncpy
而不是
strcpy
@haylem,因为结构定义可能会隐藏在某个标题中,而有人会天真地更改静态初始值设定项并忘记计算字符数。@StoryTeller:关于标准库,这是真的,我的错,它也不是POSIX的一部分。很抱歉正如我所说,我已经多年没有编写过C了,所以我只启动了一个emacs和编译器来快速运行。我更担心的是,我指出了我的知识差距,或者我的理解过时了。谢谢你纠正我。@StoryTeller:修改了答案以涵盖这一点,但保留了代码示例的简单形式。@iwin:修改。谢谢