malloc in function - 分割错误

时间:2013-07-10 11:54:26

标签: c malloc

这个程序完美无缺:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NUM 2

int tempfunction (char **comments)
{
    char str1[]="First string\n";
    char str2[]="This is the second string\n";

    *(comments+0)=(char *) malloc(strlen(str1)+1);
    *(comments+1)=(char *) malloc(strlen(str2)+1);

    strcpy(*(comments+0), str1);
    strcpy(*(comments+1), str2);
    return 0;
}

int main(void)
{
    char **comments;

    /* This is the section I am talking about */
    comments=(char **) malloc(MAX_NUM*sizeof(char *));
    if (comments==NULL)
    {
        printf("\n### ERROR: malloc failed.\n");
        exit(EXIT_FAILURE);
    }
    /* Upto here............................. */

    tempfunction(comments);
    printf("%s%s", comments[0], comments[1]);
    return 0;
}

但为了将来方便,我想将malloc部分放在tempfunction内。当我这样做时,我得到分段错误错误。

我认为这可能是由于初始化,所以我写的不是char **comments;

char a = 'a';
char *P = &a;
char **comments = &P;

但是,它仍然不起作用。如果你能帮助我理解为什么会发生这种情况以及如何解决它,我将非常感激。

3 个答案:

答案 0 :(得分:2)

尝试:

int tempfunction (char ***comments)
{
  char str1[]="First string\n";
  char str2[]="This is the second string\n";

  *comments = malloc(MAX_NUM * sizeof(**comments)); /* you must check the return of malloc */

  (*comments)[0] = strdup(str1);
  (*comments)[1] = strdup(str2);

  return 0;
}

你这样称呼它:

tempfunction(&comments);

当然,你必须在最后释放以避免内存泄漏

答案 1 :(得分:0)

如果要更改函数内的comments,则必须传递它的地址,以便适当反映。因此,您需要将&commentschar ***传递给tempfunction()

我建议将代码更新为:

int tempfunction (char ***ref_comments)
{
    char str1[]="First string\n";
    char str2[]="This is the second string\n";

    char **comments = malloc(MAX_NUM*sizeof(char *));

    *(comments+0)=(char *) malloc(strlen(str1)+1);
    *(comments+1)=(char *) malloc(strlen(str2)+1);

    strcpy(*(comments+0), str1);
    strcpy(*(comments+1), str2);

    //now update the passed variable
    *nef_comments = comments;
    return 0;
}

int main(void)
{
    char **comments;

    /* This is the section I am talking about */
    comments=(char **) malloc(MAX_NUM*sizeof(char *));
    if (comments==NULL)
    {
        printf("\n### ERROR: malloc failed.\n");
        exit(EXIT_FAILURE);
    }
    /* Upto here............................. */

    // pass address of comments
    tempfunction(&comments);
    printf("%s%s", comments[0], comments[1]);
    return 0;
}

答案 2 :(得分:-2)

不要传递来自main函数的char **注释, 而不是这样做,你可以在tempfunction中声明char **注释,然后将注释的引用返回给main函数。它会起作用。