解决错误'与返回的本地变量相关联的堆栈内存的地址'

时间:2015-12-11 15:56:39

标签: c arrays string heap-memory stack-memory

我正在尝试调用一个方法来生成 2D char数组(字符串数组)并将其返回以在另一个函数中使用。

我的例子:

char ** example(void)
{
    char *test[3];

    int i;
    for (i = 0; i < 3; i++) {
        test[i] = malloc(3 * sizeof(char));
    }

    test[foo][bar] = 'baz'; // of course I would declare 'foo' and 'bar'
    // ...
    // ...

    return test;
}

然后我希望能够按如下方式使用该数组:

void otherMethod(void)
{
    char ** args = example();
    // do stuff with args
}

问题是这会产生错误

  

警告:与本地变量相关的堆栈内存地址&#39; test&#39;回         [-Wreturn堆栈地址]

我可以通过在全局范围内定义test而不是本地来解决这个问题,但我宁愿不要这样做,因为它似乎很乱,特别是如果我要有其中的几个。

有没有办法在C中创建和返回字符串数组而不是全局定义?

4 个答案:

答案 0 :(得分:4)

你走在正确的轨道上。您需要做的就是将test[3];本身的分配从自动(又称“堆栈”)更改为动态(又称“堆”):

char **test = malloc(3 * sizeof(char*));

这使得从函数返回test是合法的,因为它将不再返回与堆栈分配相关联的地址。

当然调用者需要free返回内部的指针和返回本身。您可能需要考虑为此提供辅助函数。

另一种方法是将char test[]作为函数参数:

void example(char *test[], size_t count) {
    for (size_t i = 0 ; i < count ; i++) {
        test[i] = malloc(3 * sizeof(char));
    }
    ...
    // return is not required
}

现在调用者必须将一个合适大小的数组传递给你的函数,这样你就可以避免分配它。

答案 1 :(得分:1)

使用malloc

char ** example(void)
{
    char** test = malloc(sizeof(char*) * 3);

    int i;
    for (i = 0; i < 3; i++) {
        test[i] = malloc(3 * sizeof(char));
    }

    test[foo][bar] = 'baz'; // of course I would declare 'foo' and 'bar'
    // ...
    // ...

    return test;
}

答案 2 :(得分:0)

这主要是对@ dasblinkenlight的回答的补充。

你写道:

button

test[i] = malloc(3 * sizeof(char)); 现在是一个char数组,可以包含最多2个字符的字符串和终止null。你应该这样加载它:

test[i]

所以我会写:

strncpy(test[i], 2, str); /* where str is another char pointer */

C字符串乍一看可能令人困惑; - )

答案 3 :(得分:0)

使用static

static char *test[3];