从函数中获取const char *数组

时间:2013-06-07 10:32:23

标签: c

需要帮助从函数中获取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;
}

这里有什么不对,以及如何获取主要值?

6 个答案:

答案 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)

  1. 语法错误,因为您将返回类型声明为const char*并且您尝试返回const char**

  2. 语义上是错误的,因为您试图返回指向堆栈上分配的数组的指针。

答案 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 *进行丑陋的调用。