初始化一个 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;

等等。等等

【讨论】:

不会 &amp;mystr&amp;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 *)&amp;mystr, myotherstring; char * myarr2[10]; char * myarr3[10] = 0; const char * myarr4[10] = (char *)&amp;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&lt;std::string&gt; 将使跟踪所有内存操作变得更加容易。

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

从‘char *’初始化‘char’从指针生成整数而不进行强制转换

C语言 char** p 初始化

在 C++ 中合理地初始化 char 数组?