为 char* 动态分配内存时出错
An error when dynamically allocating memory for a 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,然后复制到 wordBank 的动态分配的 char* 数组中。但是我总是遇到分段错误并且单词都不正确。我做错了什么?
这一行是错误的:
char *wordBank[] = {new char[numWords+1]};
wordBank
是一个只有一个元素的数组,该元素的值是一个指向具有 numWords+1
个字符的字符数组的指针。当您访问 wordBank[1]
时,您超出了数组的范围,这会导致未定义的行为。
你显然想要的是:
char **wordBank = new char*[numWords];
这将创建一个动态分配的 numWords
char*
元素数组,然后您将在 for
循环中分配这些元素。
我认为 numWords+1
没有任何必要。
您可以使用 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;
}
}
所以主要问题是代码中存在 运行 时间错误:
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,然后复制到 wordBank 的动态分配的 char* 数组中。但是我总是遇到分段错误并且单词都不正确。我做错了什么?
这一行是错误的:
char *wordBank[] = {new char[numWords+1]};
wordBank
是一个只有一个元素的数组,该元素的值是一个指向具有 numWords+1
个字符的字符数组的指针。当您访问 wordBank[1]
时,您超出了数组的范围,这会导致未定义的行为。
你显然想要的是:
char **wordBank = new char*[numWords];
这将创建一个动态分配的 numWords
char*
元素数组,然后您将在 for
循环中分配这些元素。
我认为 numWords+1
没有任何必要。
您可以使用 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;
}
}