c ++我怎样才能正确预定义char *数组?

时间:2010-12-14 20:12:47

标签: c++ c constants string-literals

我这样做:

int argc = 9;
char* argv[argc];

argv[0] = "c:/prog.exe";

但我注意到它已被弃用。有什么更好的方法?

6 个答案:

答案 0 :(得分:1)

你必须要使它成为const:

const char *argv[] = { "Arg1", "Arg2", "..." };

...或者不使用常量字符串文字:

int argc = 9;
char* argv[argc];
char prog_name[] = "c:/prog.exe";
argv[0] = prog_name;

答案 1 :(得分:1)

除了为数组大小使用常量表达式之外的其他东西的问题......

已弃用的东西是将字符串文字静默转换为char*。过去没问题:

char * hello = "hello";

现在必须是:

char const* hello = "hello";

这个弃用实际上是在C ++ 03的附录中。

答案 2 :(得分:0)

尝试使用const表示不会修改字符串。

const char* argv[] = { "c:/prog.exe" };
const int argc = sizeof(argv) / sizeof(argv[0]);

int main()
{
    for(int i = 0; i < argc; ++i)
    {
        ::printf("%s\n", argv[i]);
    }
}

此处,argc也将在编译时自动计算,因此出错的可能性较小(感谢Goz的建议)。

答案 3 :(得分:0)

让我们分析一下你在做什么:

// Create an int with value 9.
int argc = 9;

// Create an array of char* pointers of size 9
char* argv[argc];

// Assign the the first pointer to the global data string "C:\prog.exe"
argv[0] = "c:/prog.exe";

我的猜测是你没有尝试做我上面所描述的。尝试这样的事情:

// create an array of characters
char argv[] = "C:/prog.exe";

// argc in now the length of the string
int argc = sizeof argv;

- 或 -

// create an array of strings
char* argv[] = {"C:/prog.exe"};
// argc is now the number of strings in the array
int argc = 1;

答案 4 :(得分:0)

Vlad的

+1。

我在这里发生的更多解释:

您收到“已弃用”警告,因为此类代码:

"asdf"

现在有const char*类型,而不是char*。并且字符串文字可以转换为char*,以便在const不那么严格时保留与旧约定的一些兼容性。但是,不推荐将字符串文字从char*转换为const char*,您不应该依赖它。

为什么呢?字符串文字是指向常量内存的指针,这就是它需要const char*的原因。

答案 5 :(得分:0)

除了其他人已经指出的const字符串文字被分配给非const char指针以及在main()的参数列表之外声明argv和argc的怪异之外,这里有一个额外的问题:

char* argv[argc];

您只能在C ++中对数组大小使用整数常量表达式;整数常量表达式是程序源中的字面整数(如“5”或“10”),枚举值(如“枚举颜色{红色,绿色,蓝色}”中的“红色”),sizeof表达式,或用const:

声明的int变量
// can hold 30 ints
int myarray1[30];

// can hold as many ints as myarray1 is wide in bytes
int myarray2[sizeof(myarray1)];

// C++ does not support variable-length arrays like C99 does, so if an int
// variable is used to specify array size, it must be marked const:
const int myarray3_size = 42;
int myarray3[myarray3];

许多C ++编译器实现了C99风格的可变长度数组,因此在使用它们时可能不会引起任何抱怨,但如果您想编写可移植代码,最好避免使用它们。