1

需要帮助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;
}

这里有什么不正确以及如何将值设为 main?

4

6 回答 6

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;
}
于 2013-06-07T10:40:27.947 回答
1
  1. 它在语法上是错误的,因为您将返回类型声明为const char*并且您正在尝试返回const char**

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

于 2013-06-07T10:39:19.583 回答
0

没有初始化 main 中名为“values”的字符指针数组。该功能应该做什么?它什么都不做,并且它的返回值在 main 中被忽略。

于 2013-06-07T10:39:04.700 回答
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()on const char *s 进行丑陋的调用。

于 2013-06-07T11:28:36.653 回答
0

变量 one_str、two_str、three_str 和 values 是“strings_to_array”函数的局部变量。它们在此功能之外没有有效的存在。

通过返回“值”(即:指向局部变量的指针),您将返回指向无效内存位置的指针。

于 2013-06-07T10:40:17.193 回答
0

一种方法是将变量声明为静态,因为您将在该函数之外访问它们。这只是意味着一旦您退出该功能,这些记忆就不会丢失。此外,您应该返回 achar **而不是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;
}
于 2013-06-07T10:43:54.960 回答