c java服务返回数组为空_使用C返回数组

C对数组的处理是非常与Java不同,您将不得不相应地调整您的思维。C中的数组不是一流的对象(也就是说,数组表达式在大多数上下文中不保留它的“数组性”)。在C中,“N元素数组”类型的表达式T将隐式转换(“衰变”)为“类型”的表达式。T“,除非数组表达式是sizeof或一元&运算符,或者如果数组表达式是字符串文本,则用于初始化声明中的另一个数组。

除其他外,这意味着不能将数组表达式传递给函数并使其收到。作为数组类型;该函数实际上接收指针类型:void foo(char *a, size_t asize){

// do something with a}int bar(void){

char str[6] = "Hello";

foo(str, sizeof str);}

在呼唤foo,表达str从类型转换为char [6]到char *的第一个参数foo宣告char *a而不是char a[6]..在……里面sizeof str,因为数组表达式是sizeof运算符,它没有转换为指针类型,因此您可以获得数组(6)中的字节数。

如果你真的有兴趣,你可以读丹尼斯·里奇的C语言的发展来了解这种治疗的来源。

结果是函数不能返回数组类型,这很好,因为数组表达式也不能作为分配的目标。

最安全的方法是调用方定义数组,并将其地址和大小传递给应该写入的函数:void returnArray(const char *srcArray, size_t srcSize, char *dstArray, char dstSize){

...

dstArray[i] = some_value_derived_from(srcArray[i]);

...}int main(void){

char src[] = "This is a test";

char dst[sizeof src];

...

returnArray(src, sizeof src, dst, sizeof dst);

...}

另一种方法是函数动态分配数组并返回指针和大小:char *returnArray(const char *srcArray, size_t srcSize, size_t *dstSize){

char *dstArray = malloc(srcSize);

if (dstArray)

{

*dstSize = srcSize;

...

}

return dstArray;}int main(void){

char src[] = "This is a test";

char *dst;

size_t dstSize;

dst = returnArray(src, sizeof src, &dstSize);

...

free(dst);

...}

在这种情况下,调用方负责使用free图书馆功能。

请注意dst在上面的代码中,有一个简单的指针指向char,而不是指向char..C的指针和数组语义使您可以应用下标运算符[]数组类型的表达式。或指针类型src[i]和dst[i]将访问i数组的第四个元素(即使只有src有数组类型)。

你,你们能,会,可以声明指向N元素数组的指针。T做一些类似的事情:char (*returnArray(const char *srcArr, size_t srcSize))[SOME_SIZE]{

char (*dstArr)[SOME_SIZE] = malloc(sizeof *dstArr);

if (dstArr)

{

...

(*dstArr)[i] = ...;

...

}

return dstArr;}int main(void){

char src[] = "This is a test";

char (*dst)[SOME_SIZE];

...

dst = returnArray(src, sizeof src);

...

printf("%c", (*dst)[j]);

...}

以上几个缺点。首先,C的旧版本期望SOME_SIZE要成为编译时常量,意味着该函数只能使用一个数组大小。其次,在应用下标之前,必须取消指针的引用,这会使代码混乱。当您处理多维数组时,指向数组的指针工作得更好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值