阵列初始化问题

时间:2012-06-18 15:47:28

标签: c++ arrays pointers

我需要一个空的char数组,但是当我尝试做这样的事情时:

char *c; 
c = new char [m];
int i;
    for (i = 0; i < m; i++)
    c[i] = 65 + i;

然后我打印c。可以看到c = 0x00384900 "НННННННээээ««««««««юоюою" 在循环后它变为:0x00384900 "ABCDEFGээээ««««««««юоюою" 我怎么解决这个问题?或者也许有字符串的方式?

5 个答案:

答案 0 :(得分:3)

如果您正在尝试创建字符串,则需要确保字符序列以空字符\0终止。

换句话说:

char *c; 
c = new char [m+1];
int i;
    for (i = 0; i < m; i++)
    c[i] = 65 + i;
c[m] = '\0';

没有它,像printf这样的字符串上的函数将不知道字符串的结束位置。

printf("%s\n",c); // should work now

答案 1 :(得分:3)

如果您创建堆数组,OS将不会初始化它。 为此,您可以选择以下选项:

  1. 静态或全局分配数组。该数组将自动填充零。
  2. 在堆初始化或堆栈数组上使用::memset( c, 0, m );以零填充它。
  3. 使用高级类型,如std :: string。

答案 2 :(得分:2)

我相信你的调试器试图解释字符串。使用char数组表示C或C ++中的字符串时,需要在字符串的末尾包含一个空字节。因此,如果为c分配m + 1个字符,然后设置c[m] = '\0',则调试器应该为您提供您期望的值。

答案 3 :(得分:1)

如果你想要一个动态分配的字符串,那么最好的选择是使用标准库中的string类:

#include <string>

std::string s;
for (i = 0; i < m; i++)
    s.push_back(65 + i);

答案 4 :(得分:0)

C字符串以空值终止。这意味着最后一个字符必须是空字符('\ 0'或只是0)。

操作字符串的函数使用数组开头(作为参数传递,数组中的第一个位置)和空值之间的字符。如果数组中没有空字符,函数将迭代传递它的内存,直到找到一个(内存泄漏)。这就是为什么你的例子中印有一些垃圾。

当您在代码中看到文字常量时,如printf("Hello");,它会转换为长度为6的字符数组('H','e','l','l','o '和'\ 0');

当然,为了避免这种复杂性,您可以使用std :: string。