我构建了一个从用户获取字符串输入的函数。 然后它分配内存,但在3次输入后程序崩溃。
void friendNamesInput(int friendNum, char **ppFriendName) {
char name[50] = { 0 }; //name
char *byteReALL = 0; //allocate bytes
int i = 0;
for (i = 0; i < friendNum; i++)
{
printf("Enter name of friend %d:", i + 1);
fgets(name, 50, stdin); //input 50
byteReALL = (char*)malloc(sizeof(char)*strlen(name)); //allcate nedded mem
strncpy(byteReALL, name,50); //copy string data
ppFriendName[i] = byteReALL; //address to array of arrays
}
}
答案 0 :(得分:1)
您没有为正在复制的字符串分配足够的内存:
byteReALL = (char*)malloc(sizeof(char)*strlen(name));
C中的字符串以空值终止,因此您需要为该字符添加1个额外字节。此外,sizeof(char)
定义为1,因此无需乘以:
byteReALL = malloc(strlen(name) + 1);
更好的方法是使用strdup
,它为字符串分配空间并在一步中将其复制到新分配的缓冲区:
printf("Enter name of friend %d:", i + 1);
fgets(name, 50, stdin);
ppFriendName[i] = strdup(name);