我正在尝试调用一个方法来生成 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中创建和返回字符串数组而不是全局定义?
答案 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];