动态char指针数组到字符串

时间:2016-04-28 09:11:52

标签: c arrays string pointers dynamic

在这段代码中,我希望得到一些朋友,然后得到我想要的名字,字符串将动态分配用户输入的长度,我用2个函数:

void getNum(char** names, int* num)
{
    //somecode
    names = (char*)malloc(*num * sizeof(char));
    //check
}

void getNames(char** names, int* num)
{
    int i = 0;
    int len = 0;
    char name[LEN] = { 0 };

    getchar(); //buffer cleaning
    for (i = 0; i < *num; i++)
    {
        printf("enter #%d friend name: ", i+1);
        myFgets(name, LEN); //getting name and cleaning "\n" at end
        len = strlen(name)+1; // getting the size of string include "/0"
        *(names + i) = (char*)malloc(len * sizeof(char));
        if (*(names[i]) == NULL)
        {
            printf("Error allocating memory!\n"); //print an error message
            return 1; //return with failure
        }
        strncpy(*names, name, len);
    }
}

第二个动态分配对我不起作用,溢出错误:“访问违规写入位置”。如果第一次分配将在第二个函数中,它将正常工作。你可以解释一下吗?我需要做什么才能以这种方式运作? 提前谢谢你......

2 个答案:

答案 0 :(得分:2)

在函数getNames中,您使用了错误的指针来检查NULLnames[i]*(names+i),与*(names[i])不同,也是不要施放malloc的返回值。无需使用sizeof(char),它始终为1。

*(names + i) = (char*)malloc(len * sizeof(char));
if (*(names[i]) == NULL) // compare to the wrong pointer
{
    printf("Error allocating memory!\n"); //print an error message
    return 1; //return with failure
}
strncpy(*names, name, len); // copy to the wrong buffer

尝试以下方法:

names[i] = malloc(len);
if (names[i] == NULL)
{
    printf("Error allocating memory!\n"); 
    return 1; //return with failure
}
strncpy(names[i], name, len);

另外,在getNum中,要为char指针分配数组,请使用

void getNum(char ***names, int *num) {
    *names = malloc(*num * sizeof(char*));
}

您将通过

调用它
char **names;
getNum(&names, &num);

你也可以通过char **getNum(...)返回它。

答案 1 :(得分:1)

假设第一个函数应该分配一个指针数组,并且第二个函数应该分配单个的char数组来存储各个名称,那么在第一个函数中缺少一个间接级别:

  • 您传递了char**的副本(C副本参数)
  • 你只使用本地副本来存储malloc的结果(这是错误的BTW)并且仍然保留调用者的原始值并最终在离开函数时获得内存泄漏,因为没有任何内容指向已分配的块

应该是:

char** getNum(int num)   /* no need to pass num by reference */
{
    char **names;
    //somecode
    names = malloc(num * sizeof(char*)); /* do not cast resul of malloc in C */
    //check
    return names
}

在第二个函数中,你应该一致地为names[i](或*(names + i))分配内存,测试它为NULL并在那里复制字符串:

    names[i] = malloc(len * sizeof(char));
    if (names[i] == NULL)
    {
        printf("Error allocating memory!\n"); //print an error message
        return 1; //return with failure
    }
    strncpy(names[i], name, len);