需要帮助从函数中获取const char*
数组,以便可以在main中打印元素。
主:
const char* values[3];
strings_to_array();
printf("%s\n", values[1]);
printf("%s\n", values[2]);
功能:
const char* strings_to_array()
{
char one_str[16];
char two_str[16];
char three_str[16];
strcpy(one_str, "one");
strcpy(two_str, "two");
strcpy(three_str, "three");
const char* values[] = {one_str, two_str, three_str};
return values;
}
这里有什么不对,以及如何获取主要值?
答案 0 :(得分:9)
此代码的主要问题是:C中的函数不应返回指向局部变量的指针,因为它们存储在堆栈中,这意味着一旦函数返回它们就不可用。
所以这一行:
const char* values[] = {one_str, two_str, three_str};
可替换为:
const char** values = malloc(3*sizeof(char *));
values[0] = strdup(one_str);
values[1] = strdup(two_str);
values[2] = strdup(three_str);
以上示例的完整工作代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const char** strings_to_array()
{
char one_str[16];
char two_str[16];
char three_str[16];
strcpy(one_str, "one");
strcpy(two_str, "two");
strcpy(three_str, "three");
const char** values = malloc(3*sizeof(char *));
values[0] = strdup(one_str);
values[1] = strdup(two_str);
values[2] = strdup(three_str);
return values;
}
int main() {
const char** values = strings_to_array();
printf("%s\n", values[1]);
printf("%s\n", values[2]);
free((void *)values[0]);
free((void *)values[1]);
free((void *)values[2]);
free(values);
return 0;
}
答案 1 :(得分:1)
语法错误,因为您将返回类型声明为const char*
并且您尝试返回const char**
。
语义上是错误的,因为您试图返回指向堆栈上分配的数组的指针。
答案 2 :(得分:0)
没有任何内容初始化main中名为“values”的字符指针数组。应该做什么功能?它什么都不做,它的返回值在main中被忽略。
答案 3 :(得分:0)
变量one_str,two_str,three_str和values是'strings_to_array'函数的局部变量。它们在此功能之外没有有效存在。
通过返回'values'(即:指向局部变量的指针),返回指向无效内存位置的指针。
答案 4 :(得分:0)
一种方法是将变量声明为静态,因为您要在该函数之外访问它们。它只是意味着一旦退出函数,那些内存就不会丢失。此外,您应该返回char **
而不是char *
。
const char** strings_to_array()
{
static char one_str[16];
static char two_str[16];
static char three_str[16];
strcpy(one_str, "one");
strcpy(two_str, "two");
strcpy(three_str, "three");
static const char* values[] = {one_str, two_str, three_str};
return values;
}
答案 5 :(得分:0)
当你处理文字("one"
,...)时,你可以简单地分配他们的地址。
主:
void string_to_array(const char **);
const char * values[3] = {NULL};
strings_to_array(values);
printf("%s\n", values[0]);
printf("%s\n", values[1]);
printf("%s\n", values[2]);
功能:
void strings_to_array(const char ** values)
{
values[0] = "one";
values[1] = "two";
values[2] = "three";
}
如果你真的需要它作为一个函数返回对数组的引用,就这样做:
const char ** strings_to_array2(const char ** values)
{
values[0] = "one";
values[1] = "two";
values[2] = "three";
return values;
}
这使您无法对free()
上的const char *
进行丑陋的调用。