如何在C中返回一个字符串数组?

时间:2011-10-03 04:34:27

标签: c arrays string function pointers

例如,我在主文件中

1) char ** array[NUMBER];
2) array = build_array();

并在导入的文件中

char ** build_array()
{
  char ** array[NUMBER];
  strings[0] = "A";
  strings[1] = "B";
  return (char *) strings;
}

但是,在主文件的第2行,我收到错误:"incompatible types when assigning to type 'char **[(unsighed int)NUMBER]' from type 'char **'

我做错了什么?任何建议或意见将不胜感激。提前谢谢。

3 个答案:

答案 0 :(得分:11)

C中的字符串似乎有些混乱。在C中,char s的空终止序列被认为是字符串。它通常由char*表示。

  

我只想调用build_array()函数并返回字符串数组

你几乎不能返回一个数组,也不能返回一个指向本地数组的指针。但是,您可以将数组作为参数传递给build_array,并将其size传递给它,并填充它。

void build_array( char* strings[], size_t size )
{
  // make sure size >= 2 here, based on your actual logic
  strings[0] = "A";
  strings[1] = "B";
}
...later called as:...
char *array[NUMBER];
build_array(array, NUMBER);

替代方法是返回指向全局或静态分配数组的指针,这将使您的函数不可重入。你现在可能不关心这个问题,但这是不好的做法所以我建议你不要走那条路。

答案 1 :(得分:3)

正如littleadv所指出的,你的代码有几个问题:

  • char **char **[ ]

  • 之间不匹配
  • 返回指向本地变量的指针

此示例可能有所帮助:

#include <stdio.h>
#include <string.h>
#include <malloc.h>

#define NUMBER 2
#define MAX_STRING 80

char **
build_array ()
{
  int i = 0;
  char **array = malloc (sizeof (char *) * NUMBER);
  if (!array)
    return NULL;
  for (i = 0; i < NUMBER; i++) {
    array[i] = malloc (MAX_STRING + 1);
    if (!array[i]) {
      free (array);
      return NULL;
    }
  }
  strncpy (array[0], "ABC", MAX_STRING);
  strncpy (array[1], "123", MAX_STRING);
  return array;
}

int
main (int argc, char *argv[])
{
  char **my_array = build_array ();
  if (!my_array) {
    printf ("ERROR: Unable to allocate my_array!\n");
    return 1;
  }
  else {
    printf ("my_array[0]=%s, my_array[1]=%s.\n",
      my_array[0], my_array[1]);
  }
  return 0;
}

答案 2 :(得分:1)

您的返回类型为char**,而您将其分配给char**[],这是不兼容的。

除此之外你应该发布你遇到问题的实际代码,你发布的代码不会编译,也没有多大意义。

为了修复您的代码,该函数应该返回char **[NUMBER]。另请注意,您将返回值转换为char*,而不是您声明的char**(或char **[NUMBER]它应该是,实际上是 - 。

哦,并且返回指向局部变量的指针,就像你的情况一样,是崩溃和未定义行为的完美配方。

你可能意味着:

char *array[NUMBER];
int ret = build_array(array, NUMBER);
// do something with return value or ignore it

并在导入的文件中

int build_array(char **arr, int size)
{
  // check that the size is large enough, and that the
  // arr pointer is not null, use the return value to
  // signal errors
  arr[0] = "A";
  arr[1] = "B";
  return 0; // asume 0 is OK, use enums or defines for that
}