例如,我在主文件中
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 **'
我做错了什么?任何建议或意见将不胜感激。提前谢谢。
答案 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
}