C从字符串数组打印字符串时出错

C从字符串数组打印字符串时出错,c,dynamic-memory-allocation,free,c-strings,C,Dynamic Memory Allocation,Free,C Strings,我是一个新手,我正在尝试为数组获取字符串,但由于某些原因,我无法打印它们,有人知道为什么?。多谢各位 int main(void) { int number_friends = 0, i = 0; printf("Enter number of friends: "); scanf("%d", &number_friends); getchar(); char** friends = (char**)mal

我是一个新手,我正在尝试为数组获取字符串,但由于某些原因,我无法打印它们,有人知道为什么?。多谢各位

int main(void)
{

    int number_friends = 0, i = 0;
    printf("Enter number of friends: ");
    scanf("%d", &number_friends);
    getchar();
    char** friends = (char**)malloc(number_friends * sizeof(char*));
    get_friends_names(friends, number_friends);
    for (i = 0; i < number_friends; i++)
    {
        printf("%s\n", friends[i]);
    }
    free(friends);
    getchar();
    return 0;
}

void get_friends_names(char** friends, int size)
{
    char name[STR_LEN] = {0};
    int i = 0, len = 0;
    for (i = 0; i < size; i++)
    {
        fgets(name, STR_LEN, stdin);
        name[strcspn(name, "\n")] = 0;
        friends[i] = malloc(STR_LEN);
        friends[i] = name;
    }
}
int main(无效)
{
int number_friends=0,i=0;
printf(“输入好友数:”);
scanf(“%d”&朋友数);
getchar();
char**friends=(char**)malloc(number_friends*sizeof(char*);
获取朋友的姓名(朋友、朋友数量);
对于(i=0;i
此代码段

    friends[i] = malloc(STR_LEN);
    friends[i] = name;
没有意义,有两个缺点

第一个问题是内存泄漏。也就是说,内存是动态分配的,它的地址被分配给指针
friends[i]
,然后指针立即被重新分配

第二个是您为指针
friends[i]
分配了退出函数后将不活动的本地数组的地址

你至少需要像这样写

friends[i] = malloc(STR_LEN);
strcpy( friends[i], name ); 

同样,你需要释放所有分配的内存,比如

for (i = 0; i < number_friends; i++)
{
    free( friends[i] );
}
free(friends);
for(i=0;i

请注意,函数中未使用变量
len

friends[i]=name
您需要使用
strcpy(朋友[i],姓名)friends[i]=malloc(strlen(name)+1)
您应该养成检查返回代码、
scanf
malloc
fgets
所有可用于检查成功/失败的返回值的习惯。
for (i = 0; i < number_friends; i++)
{
    free( friends[i] );
}
free(friends);