嗯,这是我的计划:
#include <iostream>
using namespace std;
int main()
{
char str[6][80] = { "Robert Redford",
"Hopalong Cassidy",
"Lassie",
"Slim Pickens",
"Boris Karloff",
"Oliver Hardy" };
const char* pstr[] = { "Robert Redford",
"Hopalong Cassidy",
"Lassie",
"Slim Pickens",
"Boris Karloff",
"Oliver Hardy" };
cout << "str:\n";
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 80; j++)
{
cout << str[i][j];
}
}
cout << endl;
cout << "pstr:\n";
for (int i = 0; i < strlen(*pstr) ; ++i)
{
cout << pstr[i] << endl;
}
cout << "Size of str:" << sizeof str << endl;
cout << "Size of pstr:" << sizeof pstr << endl;
return 0;
}
问题是,程序突然停止运行而没有显示str和pstr的大小,我收到一个消息框,说Pointers3.exe停止工作。 我想知道的是,即使它打印出pstr,为什么程序停止工作?
由于声誉限制,我无法发布图片,但这里有一个截图供您考虑。
答案 0 :(得分:3)
表达式strlen(*pstr)
给出了pstr
数组中第一个字符串的长度,而不是数组的大小。
为此你可以使用sizeof(pstr) / sizeof(*pstr)
。请注意,此技巧仅适用于正确的数组,而不适用于指针。所以,如果你是将数组传递给一个函数,这使得数组衰减为指针,你不能使用这个技巧。
如果您超出pstr
数组的范围,会导致undefined behavior,并且很可能会导致程序崩溃。