此程序运行良好:
#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函数。它会起作用的。