从函数返回字符串数组
我需要返回一个 char**
但当我尝试这样做时,编译器告诉我我想返回局部变量的地址。我怎样才能做到这一点?我知道我应该为这个变量分配空间,但是如何分配空间呢?这是我的代码,但第二个 printf
没有出现,并且该函数不返回任何内容:
char** parse_cmd(const char* cmdline) {
char** arguments = (char**)malloc(100);
int i;
int j=0, k=0;
printf("%s\n", cmdline);
for(i=0; i<100; i++) {
arguments[i] = malloc(100);
}
for(i = 0; i < strlen(cmdline); i ++) {
if(cmdline[i] != ' ') {
arguments[j][k] = cmdline[i];
k++;
} else {
arguments[j][k] = '\0';
j++;
k = 0;
}
}
printf("%s\n", arguments[1]);
return arguments;
}
I need to return a char**
but when I try to do this, the compiler tells me that I want to return the address of a local variable. How can I do that? I know that I should allocate space for this variable but how? Here is my code, but the second printf
doesn't appear and the function returns nothing:
char** parse_cmd(const char* cmdline) {
char** arguments = (char**)malloc(100);
int i;
int j=0, k=0;
printf("%s\n", cmdline);
for(i=0; i<100; i++) {
arguments[i] = malloc(100);
}
for(i = 0; i < strlen(cmdline); i ++) {
if(cmdline[i] != ' ') {
arguments[j][k] = cmdline[i];
k++;
} else {
arguments[j][k] = '\0';
j++;
k = 0;
}
}
printf("%s\n", arguments[1]);
return arguments;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您需要进行多次分配。第一个用于
char**
,然后用于每个char*
。例如类似的东西You need to do multiple allocations. The first for the
char**
and then for each of thechar*
. E.g. something like这是我组装并测试的代码。它对 argv 参数列表和组装的每个参数都使用动态内存分配。函数
release_cmd()
释放分配的空间。函数cleanup()
是内部函数,它在失败时释放分配的空间,然后返回空双指针。这简化了错误处理。prompt()
函数和main()
中有一个最小的测试工具。我还没有在valgrind
下运行,但是malloc()
的 MacOS X 实现经常发现问题,所以我有一定的信心不存在严重的内存滥用 - 但有可能是差一泄漏。我还没有通过伪造分配失败来测试cleanup()
代码。Here's the code I assembled - and tested. It uses dynamic memory allocation for both the
argv
argument list and for each argument as it is assembled. The functionrelease_cmd()
releases the allocated space. The functioncleanup()
is internal and releases allocated space on a failure, before returning a null double-pointer. This simplifies the error handling. There's a minimal test harness in theprompt()
function andmain()
. I haven't run in undervalgrind
, but the MacOS X implementation ofmalloc()
quite often spots problems so I'm moderately confident there's no gross memory abuse - but there could be an off-by-one leak. I haven't tested thecleanup()
code by faking an allocation failure.