让我们定义这个结构:
struct MyStruct {
int firstInt;
int secondInt;
char * firstString;
char * secondString;
};
我正在尝试初始化这样的结构:
MyStruct s = {4, 5, {'a', 'b', 'c'}, "abc"};
但它不起作用。有什么办法吗? (firstString必须在末尾没有'\ 0')
答案 0 :(得分:4)
由于您的要求是最后没有空终结符,您必须使用firstString
的数组:
struct MyStruct {
int firstInt;
int secondInt;
char firstString[3];
char * secondString;
};
然后你可以像这样初始化它:
MyStruct s = {4, 5, {'a', 'b', 'c'}, "abc"};
您无法使用char*
初始化{'a', 'b', 'c'}
,因为您必须为字符提供存储空间,char*
只能指向某些内容。 "abc"
恰好是一个常量字符串文字,存储在只读内存中,因此您可以在此处生成char*
点。
此外,在C ++中,"abc"
是一个我无法修改的常量,因此您应该将char * secondString;
更改为const char * secondString;
。
答案 1 :(得分:2)
您可以使用复合文字:
struct MyStruct {
int firstInt;
int secondInt;
char * firstString;
char * secondString;
};
struct MyStruct s = { 4, 5, (char[]){'a', 'b', 'c'}, "abc" };
该构建体在C99中引入;见the N1256 draft的第6.5.2.5节。一些编译器(特别是微软)可能不支持它。
请注意,在C中,struct MyStruct
类型不能仅称为MyStruct
;这是C和C ++之间的区别。确保你正在编译你认为的语言。
需要注意的一件事是与复合文字相关联的对象的生命周期。字符串文字表示具有静态生存期的数组对象,即该对象存在于整个程序执行中。与(char[]){'a', 'b', 'c'}
关联的数组对象如果发生在函数体外,则具有静态存储持续时间,但如果它出现在函数体内,则自动存储持续时间(与最内部封闭块相关联)。如果您尝试在其定义的块之外传递s
的副本,则可能会出现问题。
答案 2 :(得分:0)
出现了一个微妙的问题。你的结构有两个char *
,但没有存储来支持这些指针。你可能想要这样的东西:
struct MyStruct {
int firstInt;
int secondInt;
char firstString[3];
char secondString[4];
};
答案 3 :(得分:-1)
#include <iostream>
using namespace std;
struct MyStruct {
int firstInt;
int secondInt;
char * firstString;
char * secondString;
};
int main()
{
char arr[] = {'a', 'b', 'c','\0'};
MyStruct s = {4, 5, arr, "abc"};
cout << s.firstString << endl;
return 0;
}
MyStruct s = {4, 5, {'a', 'b', 'c'}, "abc"};
{'a', 'b', 'c'} have no memory to store.It's a r-value.
- 我想。 ^ - ^