将字符串从静态内存复制到动态内存失败

时间:2018-05-03 19:19:29

标签: c arrays string memory malloc

我构建了一个从用户获取字符串输入的函数。 然后它分配内存,但在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

    }
}

1 个答案:

答案 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);