如何在c函数中动态malloc内存?

我想调用这样的函数:

char* Seg(char* input, char **segs, int* tags) 

实际上input是真正的输入, segs tags是返回,现在返回是错误消息。

我的程序是这样的:

 #include  char* Seg(char* input, char **segs, int* tags) { // dynamic malloc the memory here int count = strlen(input); // this count is according to input for (int i = 0; i < count; i++) { segs[i] = "abc"; } for (int i = 0; i < count; i++) { tags[i] = i; } return NULL; } int main(int argc, char *argv[]) { char** segs = NULL; int* tags = NULL; Seg("input", segs, tags); return 0; } 

我问我怎样才能返回segstags的值?


编辑

现在我将代码更改为:

 #include  #include  #include  /** * input is input params, segs and tags is results * return: error msg */ int Seg(char* input, char ***segs, int** tags) { int n = strlen(input); int *tags_ = malloc(n * sizeof(int)); for (int i = 0; i < n; i++) { tags_[i] = i; } tags = &tags_; char **segs_ = malloc(sizeof(char *) * n); for (int i = 0; i < n; i++) { segs_[i] = "haha"; } segs = &segs_; return n; } int main(int argc, char *argv[]) { char** segs = NULL; int* tags = NULL; int n = Seg("hahahahah", &segs, &tags); printf("%p", tags); free(segs); free(tags); return 0; } 

为什么tags仍然是零?

如果我理解正确,那么您需要以下内容。

我为这两个动态分配的数组使用了sentinel值。 您可以使用自己的方法而不是使用sentinel值。

 #include  #include  #include  char * Seg( const char *input, char ***segs, int **tags ) { // dynamic malloc the memory here size_t count = strlen( input ); // this count is according to input *segs = malloc((count + 1) * sizeof(char *)); *tags = malloc((count + 1) * sizeof(int)); for ( size_t i = 0; i < count; i++ ) { ( *segs )[i] = "abc"; } (*segs)[count] = NULL; for ( size_t i = 0; i < count; i++ ) { ( *tags )[i] = ( int )i; } (*tags)[count] = -1; return NULL; } int main( void ) { char **segs = NULL; int *tags = NULL; Seg( "input", &segs, &tags ); for (char **p = segs; *p; ++p) { printf( "%s ", *p ); } putchar('\n'); for (int *p = tags; *p != -1; ++p) { printf("%d ", *p); } putchar('\n'); free(segs); free(tags); return 0; } 

程序输出是

 abc abc abc abc abc 0 1 2 3 4 

更新post后,该function也可以通过以下方式查看

 #include  #include  #include  size_t Seg( const char *input, char ***segs, int **tags ) { // dynamic malloc the memory here size_t count = strlen( input ); // this count is according to input *segs = malloc(count * sizeof(char *)); *tags = malloc(count * sizeof(int)); for ( size_t i = 0; i < count; i++ ) { ( *segs )[i] = "abc"; } for ( size_t i = 0; i < count; i++ ) { ( *tags )[i] = ( int )i; } return count; } int main( void ) { char **segs = NULL; int *tags = NULL; size_t n = Seg( "input", &segs, &tags ); for (size_t i = 0; i < n; i++) { printf( "%s ", segs[i] ); } putchar('\n'); for (size_t i = 0; i < n; i++) { printf("%d ", tags[i]); } putchar('\n'); free(segs); free(tags); return 0; } 

您还可以向函数添加代码,以检查内存是否已成功分配。

至于你的附加问题那么这样的代码就像这样

 int *tags_ = malloc(n * sizeof(int)); tags = &tags_; 

更改int **类型的局部变量tags (函数参数是函数局部变量),而不是通过引用作为参数更改传递给函数的int *类型的原始指针tags