C 错误从字符串数组打印字符串

时间:2021-05-03 17:46:41

标签: c dynamic-memory-allocation free c-strings

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

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;
    }
}

1 个答案:

答案 0 :(得分:0)

这段代码

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

没有意义,有两个缺点。

第一个是内存泄漏。那就是动态分配内存并将其地址分配给指针friends[i],然后立即重新分配指针。

第二个是你为指针 friends[i] 分配了一个本地数组的地址,该数组在退出函数后将不存在。

你至少要像这样写

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

friends[i] = malloc( strlen( name ) + 1 );
strcpy( friends[i], name ); 

此外,在 main 中,您需要释放所有分配的内存,例如

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

注意变量len不在函数内部使用。