为char *动态分配内存时出错

时间:2015-02-10 02:07:39

标签: c++ arrays char

所以主要问题是代码中存在运行时错误:

char *wordBank[]= {new char[numWords+1]};
char  buffer1[41];

for(int i=0; i<numWords;i++){
    ifile >> buffer1;
    int len = strlen(buffer1);
    cout << buffer1<<"and"<<len <<endl;
    wordBank[i] = new char[len + 1];
    strncpy(wordBank[i], buffer1,len);
    cout << wordBank[i]<<"and"<<len <<endl;
}

是否开始搞乱wordBank中的内容。它将txt文件中的单词转换为buffer1,然后将if复制到wordBank的动态分配的char *数组中。但是我总是得到分段错误,而且这些都是不正确的。我做错了什么?

2 个答案:

答案 0 :(得分:3)

您可以使用C ++而不是C:

来简化代码
vector<string> wordBank(numWords);
string buffer1;
for (int i = 0; i < numWords; i++) {
  ifile >> buffer1;
  size_t len = buffer1.length();
  cout << buffer1 << "and" << len << endl;
  wordBank[i] = buffer1;
  cout << wordBank[i] << "and" << len << endl;
}

甚至更简单,但添加错误检查:

vector<string> wordBank(numWords);
for (int i = 0; i < numWords; i++) {
  if (ifile >> wordBank[i])
    cout << wordBank[i] << "and" << len << endl;
  else { // no more words
    wordBank.resize(i); // chop off the unused portion
    break;
  }
}

答案 1 :(得分:2)

这一行错了:

char *wordBank[] = {new char[numWords+1]};

wordBank是一个包含一个元素的数组,该一个元素的值是指向具有numWords+1个字符的字符数组的指针。当您访问wordBank[1]时,您超出了数组的范围,这会导致未定义的行为。

你显然想要的是:

char **wordBank = new char*[numWords];

这将创建一个动态分配的numWords char*元素数组,然后您将在for循环中分配这些元素。

我认为不需要numWords+1