请问以下这段C++代码有什么问题?

编译器是 Visual Studio 2010
运行时弹出警示框,提示words变量在未被初始化的情况下被使用。

int main ()
{
    char article[5000];
    char words[500][20];
    char sentences[100][100];
    int countSentences=0;
    int countWords=0;
    char *count;
    char *temp;
    cout<<"请输入需要解析的英语文章:";
    cin.getline(article,5000);
    count=article;
    temp=article;
    for(int i=0;*temp!=' ';temp++,i++)
        words[0][i]=*temp;
    for(;*count;count++)
    {
        if (*count==' ') countWords++;
        else if (*count=='?'||*count=='.'||*count=='!') countSentences++;
    }
    countWords++;
    cout<<"共计 "<<countWords<<" 个英语单词"<<endl;
    cout<<"共计 "<<countSentences<<" 个句子"<<endl;
    cout<<*words[0]<<endl;
}

C++小白,指针的概念这一块始终有点弄不清楚。

这里的意思是这样, 把你输入的英文字母, 循环赋值到words数组中
words是一个二维数组, 第二维是一个一个的字符, 比如输入 abcdefg 那么二维上面存放的是 a 字符 b 字符 c字符 等等
但是如果访问words的第一维 那么就是一个字符串
比如 words[0][0] = 'a' words[0][1]= 'b' words[0][2] = 'c'
那么输出 words[0]表示 abc这个字符串的地址
*word[0]就会输出 字符串 'abc'
错误的话你还是吧完整的错误信息发出来我看看

在你声明words的时候,c++会分配一段地址给这个变量
里面地址的初始值不是固定的值
那个值有可能是上一次别的程序运行完之后留下来的。

这有点像去餐馆吃东西拿到了一个桌子(地址),由于那家餐馆(c++)是不会帮你收拾桌子上的东西的,在那个桌子(地址)。别人在桌子上吃完了东西有可能没收拾桌子上的东西(没有地址上的数据清掉),那你不先清理桌子(初始化数组),读取数组数据的就有可能不小心读到一些奇奇怪怪的东西。

可能是逻辑问题,你可以画一个框图

for(int i=0;*temp!=' ';temp++,i++)
    words[0][i]=*temp;  -->这里有问题吧

words[0]的数组宽度是20,不能一直i++,你如果想用可以把把转成指针
cahr* pctempbuff = &words[0][0];

for(int i=0;*temp != ' ' && i < 5000;temp++,i++,pctempbuff++)

*pctempbuff =*temp;

顺便再申请一下数组内存初始化什么的

#define WordsdBuffSize sizeof(char)*5000

char * article= (char*)malloc(WordsdBuffSize);

memset(article, 0, WordsdBuffSize);

free(article);
article = NULL;