我有一个这样声明的结构:
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使用显式复制操作(例如 strncpy
或 strlcpy
/lstrcpy
,具体取决于目标环境)的错误。
感谢用户 StoryTeller 和 iwin 指出这一点。
静态初始化
用这个替换上面示例中的初始化行也可以:
int main(int ac, char **av) {
Address address = {
"test2"
};
OpenDatabase(address.InstrumentDB);
}
关于c - 在 C 中传递结构的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38869164/