为结构体数组中的字符指针循环赋值的有关问题

为结构体数组中的字符指针循环赋值的问题
// 002.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "malloc.h"
#include "string.h"

int main(int argc, char* argv[])
{
struct stu{
int num;
char *name;
char sex;
float score;
} *p;

p=(struct stu *)calloc(5, sizeof(struct stu));

int i;
for(i=0; i<5; i++){
sprintf(str,"%d",i); 
char ss[5]="lucy";
strcat(ss,str);
p++->name=ss;
}

for(i=5; i>0; i--){
printf("%s\n", (--p)->name);
}

return 0;
}
以上这段程序比较简单,就是先定义一个结构体,然后通过calloc动态申请5块内存,接着通过for循环为数组中的每个结构体赋值,最后再通过循环打印出每个结构体的成员值。
问题是在第一个for循环中,p++->name=ss; 这句代码我知道是有问题的,因为ss数组是被定义在for循环内部,是个局部变量,因此每次一循环完,该变量放在堆栈上的内存空间就被回收了。
我知道问题的原因,但是不知道如何解决,请高手赐教!先表示感谢了¥¥¥¥
------解决方案--------------------
要做什么?
如果是要解决局部量问题,那就扩大它的定义域,把它从循环体中拿出来
如果是要生成五个name,那就要有五个字符串容身的存储空间----只用一个ss数组能存储五个字符串?
------解决方案--------------------
int main(int argc, char* argv[]) {
struct stu{
int num;
char name[20];
char sex;
float score;
} *p;
int i;
char str[5];
char ss[5] = "lucy";
char s[10];

p = (struct stu *)calloc(5, sizeof(struct stu));

for(i=0; i<5; i++){
sprintf(str, "%d", i); 
strcpy(s, "lucy");
strcat(s, str);
strcpy(p->name, s);
p++;
}

for(i=5; i>0; i--){
--p;
printf("%s\n", p->name);
}

return 0;
}

------解决方案--------------------
p++->name=ss;
为什么那么多人喜欢用=复制字符串
------解决方案--------------------
在给name复制前开辟一个空间
#include <stdio.h>
#include <string.h>
#include <malloc.h>

struct stu
{
int num;
char* name;
char sex;
float score;
};

int main(int argc, char* argv[]) 
{
struct stu* p;
int i;
char str[20];
char ss[20] = "lucy";
char s[20];
p = (struct stu *)calloc(5, sizeof(struct stu));
for(i=0; i<5; i++)
{
p->name=(char*)malloc(sizeof(char)*20);
sprintf(str, "%d", i); 
strcpy(s, ss);
strcat(s, str);
strcpy(p->name, s);
p++;
}
for(i=5; i>0; i--)
{
--p;
printf("%s\n", p->name);
}  
return 0;
}