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



我想调用这样的函数:

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

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

我的程序是这样的:

#include <stdio.h>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
 * 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仍然是零?

如果我理解正确,那么你需要像下面这样的东西。

我对两个动态分配的数组都使用了哨兵值。您可以使用自己的方法,而不是使用哨兵值。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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

更新帖子后,该功能也可以按以下方式查看

#include <stdio.h>
#include <stdlib.h>
#include <string.h>    
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

相关内容

  • 没有找到相关文章

最新更新