我正在尝试将一个数组返回char*给函数.我已经将我的代码简化为一个测试用例,该测试用例克隆了一个char数组,而不是包含字符,而是包含指向这些字符的指针.
/*
* code.c
*/
#include <stdio.h>
char* makePointerCopy(char cIn[]);
int main() {
char cTest[] = {'c', 't', 's', 't'};
char* cPTest[] = makePointerCopy(cTest);
printf("%p %c", cPTest, *cPTest);
fflush(stdout);
return 0;
}
char* makePointerCopy(char cIn[]) {
char* cOut[sizeof(cIn)/sizeof(cIn[0])];
int iCntr;
for (iCntr = 0; iCntr < sizeof(cIn)/sizeof(cIn[0]); iCntr++)
cOut[iCntr] = cIn + iCntr;
return cOut;
}
Run Code Online (Sandbox Code Playgroud)
抛开一些警告,这就是编译器对这段代码的看法:
初始化程序无效(at
char* cPTest[] = makePointerCopy(cTest);)
为什么会这样?
因为makePointerCopy返回a char*,而不是a char*[].
您应该能够将该行更改为:
char* cPTest = makePointerCopy(cTest);
Run Code Online (Sandbox Code Playgroud)
更具体地说,你得到THAT错误消息而不是类型的原因是数组初始化器需要是编译时常量.
来自http://bytes.com/topic/c/answers/215573-invalid-initializer
即使声明不在文件范围内,它在C90和C99都是非法的.C90要求自动和寄存器阵列的编译时常量初始化器.并且C90和C99都需要使用a)字符串文字初始化字符数组,或者b)括号括起的初始化列表.
但是,类型不匹配是这里的实际问题.