函数中的c-malloc——分段错误



此程序运行良好:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NUM 2
int tempfunction (char **comments)
{
    char str1[]="First stringn";
    char str2[]="This is the second stringn";
    *(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;

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

尝试:

int tempfunction (char ***comments)
{
  char str1[]="First stringn";
  char str2[]="This is the second stringn";
  *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);

当然,为了避免内存泄漏,您必须在最后释放

如果您想在函数内部更改comments,您必须传递它的地址,以便它得到适当的反映。因此,您需要传递&comments,即char ***tempfunction()

我建议将代码更新为:

int tempfunction (char ***ref_comments)
{
    char str1[]="First stringn";
    char str2[]="This is the second stringn";
    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;
}

不要从主函数传递char**注释,不需要这样做,您可以在tempfunction中声明char**注释,然后将注释的引用返回到main函数。它会起作用的。

相关内容

  • 没有找到相关文章