初始化一个 Char*[]
Posted
技术标签:
【中文标题】初始化一个 Char*[]【英文标题】:Initializing a Char*[] 【发布时间】:2011-01-15 10:54:47 【问题描述】:问题在标题中,如何在 C++ 中初始化一个 char*[] 并为其赋值,谢谢。
【问题讨论】:
你为什么不想使用 stl ?如 std::vector<:string> ? ` ... = "hello", "world" ` 没用? 因为 std::vector<:string> 是浪费,而 char*[] 会做吗? @Chris:浪费什么? 可能会浪费健壮性。或者浪费内存泄漏不足。 【参考方案1】:虽然您可能知道,char*[] 是一个指向字符的指针数组,我猜您想存储许多字符串。初始化这样的指针数组很简单:
char ** array = new char *[SIZE];
...或者如果您在堆栈上分配内存:
char * array[SIZE];
然后您可能希望使用循环填充数组,例如:
for(unsigned int i = 0; i < SIZE; i++)
// str is likely to be an array of characters
array[i] = str;
如该答案的 cmets 中所述,如果您使用新的(动态分配)分配数组,请记住删除您的数组:
delete[] array;
【讨论】:
char ** array = new char[SIZE];
应该是char ** array = new char *[SIZE];
您还可以提醒,如果数组是动态分配的,则应该使用delete [] array
删除它(使用delete array
是当前新手的错误)。【参考方案2】:
根据您要初始化的内容,您可以执行以下任何操作:
char mystr[] = 'h','i',0;
char * myotherstring = "my other string";
char * mythirdstring = "goodbye";
char * myarr[] = 0;
char * myarr[] = &mystr, myotherstring;
char * myarr[10];
char * myarr[10] = 0;
char * myarr[10] = &mystr, myotherstring, mythirdstring, 0;
等等。等等
【讨论】:
不会&mystr
和 &myotherstring
解析为 char[]*
类型,这不是数组初始化程序的预期 char*
?
我稍微编辑了我的答案,现在它应该可以工作了。
还有一个 char * 和 const char * 之间的区别问题,每当我尝试将 const char *(常量字符串)分配给 char * 时,我的编译器都会发出警告。
是的...这实际上是为了演示初始化而不是编译器满意度:)
修复 g++ 错误:char mystr[] = 'h','i',0; const char * myotherstring = "my other string"; const char * mythirdstring = "goodbye"; char * myarr[] = 0; const char * myarr1[] = (char *)&mystr, myotherstring; char * myarr2[10]; char * myarr3[10] = 0; const char * myarr4[10] = (char *)&mystr, myotherstring, mythirdstring, 0;
【参考方案3】:
我注意到你必须小心的一件事... C 和 C++ 在初始化语法上有些分歧。正如上面 Mark B. 指出的那样,您可以这样初始化一个 char 指针数组:
const char* messages[] =
"Beginning",
"Working",
"Finishing",
"Done"
;
但是在 C++ 中。正如 kriss 指出的那样,这会向您发出有关从字符串到 char* 的不推荐转换的警告。那是因为 C++ 假设您希望将字符串用于字符串;-。
这并不总是正确的。所以当你真的想初始化一个 char* 数组时,我发现我必须这样做:
const char* messages[] =
(char*)("Beginning"),
(char*)("Working"),
(char*)("Finishing"),
(char*)("Done")
;
编译器现在很高兴...
【讨论】:
【参考方案4】:像这样:
char* my_c_string;
char* x[] = "hello", "world", 0, my_c_string ;
【讨论】:
这是一个很好的例子。如果任何函数只将参数作为 void foo( char * x[] ) ,则 0 也有助于终止循环,您不需要另一个变量来查找数组的长度。【参考方案5】:如果你真的只想要一个 C 风格的常量字符串数组(例如索引消息):
const char* messages[] =
"Beginning",
"Working",
"Finishing",
"Done"
;
如果您尝试维护运行时变量字符串的容器,使用 C++ 工具 std::vector<std::string>
将使跟踪所有内存操作变得更加容易。
std::vector<std::string> strings;
std::string my_string("Hello, world.")
strings.push_back("String1");
strings.push_back(my_string);
【讨论】:
【参考方案6】:这样:
char p1 = 'A';
char p2 = 'B';
char * t[] = &p1, &p2;
std::cout << "p1=" << *t[0] << ", p2=" << *t[1] << std::endl;
但不知何故,我相信这不是真正问题的答案......
如果你想在编译时定义一个 C 字符串数组,你应该使用一个 const char * 数组来代替:
const char * t2[] = "string1", "string2";
std::cout << "p1=" << t2[0] << ", p2=" << t2[1] << std::endl;
没有 const 我的编译器会说: 警告:不推荐将字符串常量转换为“char*”
【讨论】:
【参考方案7】:就像任何其他数组一样:
char *a, *b, *c;
char* cs[] = a, b, c; // initialized
cs[0] = b; // assignment
【讨论】:
【参考方案8】:#include <iostream>
int main(int argc, char *argv[])
char **strings = new char *[2]; // create an array of two character pointers
strings[0] = "hello"; // set the first pointer in the array to "hello"
strings[1] = "world"; // set the second pointer in the array to "world"
// loop through the array and print whatever it points to out with a space
// after it
for (int i = 0; i < 2; ++i)
std::cout << strings[i] << " ";
std::cout << std::endl;
return 0;
【讨论】:
以上是关于初始化一个 Char*[]的主要内容,如果未能解决你的问题,请参考以下文章
如何从 C++ 中的 char 指针初始化 char 数组?
在 C 中初始化一个 char 指针。为啥被认为是危险的? [复制]
c++中定义一个buff为unsigned char 型,如何初始化全为0