如何在c中实现动态malloc内存的功能?

时间:2017-10-10 10:40:22

标签: c memory 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仍为零?

1 个答案:

答案 0 :(得分:1)

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

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

#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_;

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