Sal*_*lmy 3 c++ arrays pointers
我有一段将随机字符串放入字符指针数组的代码:
char * str[100] = {0};
const int elems = sizeof(str)/sizeof(str[0]),size=5;
srand(time(0));
for(int i=0;i<elems;i++){
char rString[size] = {0};
for(int j = 0;j<size;j++){
rString[j] = 97+rand()%26;
}
rString[size] = '\0';
str[i] = new char[size];
strcpy(str[i],rString);
}
for(int i=0;i<elems;i++){
cout<<str[i]<<endl;
}
Run Code Online (Sandbox Code Playgroud)
但str[0]被污染或空虚。
您rString[size] = '\0';对元素的写入越界!最后一个元素是rString[size-1]。在此之后的任何内容都将是未定义的行为。
为了解决这个问题(但保持5个字符的字符串),你需要增加size,以6改变你的循环限制和空终止指数,如下:
int main()
{
char* str[100] = { 0 };
const int elems = sizeof(str) / sizeof(str[0]), size = 6; // Add space for nul-terminator
srand(time(0));
for (int i = 0; i < elems; i++) {
char rString[size] = { 0 };
for (int j = 0; j < size-1; j++) { // End BEFORE last character
rString[j] = 97 + rand() % 26;
}
rString[size-1] = '\0'; // Last element is at [size-1] NOT [size]
str[i] = new char[size];
strcpy(str[i], rString);
}
for (int i = 0; i < elems; i++) {
std::cout << str[i] << std::endl;
}
// And, for good measure, don't forget to free the allocated strings:
for (int i = 0; i < elems; i++) {
delete[] str[i];
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
或者(如果您坚持使用原始指针和 C 风格的字符串),您可以更改您的rString声明和str[i]分配行以使用size+1(减少输入):
//...
char rString[size+1] = { 0 };
//...
str[i] = new char[size+1];
Run Code Online (Sandbox Code Playgroud)
但是您确实应该考虑使用更现代的 C++ 技术,例如std::string和std::vector来代替动态数组。这是使用这些 STL 容器的版本:
int main()
{
std::vector<std::string> str(100);
const int elems = str.size(), size = 5;
srand(time(0));
for (int i = 0; i < elems; i++) {
std::string rString {""};
for (int j = 0; j < size; j++) {
rString += static_cast<char>(97 + rand() % 26);
}
str[i] = rString;
}
for (int i = 0; i < elems; i++) {
std::cout << str[i] << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
随时要求进一步澄清和/或解释。