0

伙计们,我的问题很简单,但我对它背后的理论感到困惑。如果有人能澄清一下,那就太好了。

我想传递某种类型的变量的动态数组,并让一个函数将该类型的变量转换为另一种类型的变量,并在以该新变量的变量数组的形式返回它之前对其进行更多的工作。

这是我不太实用的代码,向您展示我在做什么

#include <stdio.h>

//takes in unsigned char array, and returns unsigned short array

unsigned short foo( unsigned char *array, int size) 
{
    int i;
    unsigned short *LeArray = NULL;
    LeArray = (unsigned short*) malloc(size*sizeof(unsigned short));
    for ( i = 0; i < size; ++i ) &LeArray[i] = (unsigned char)&array[i];
    //do more stuff to that array here before returning it
    return *LeArray;

}
int main()
{

    int i, ArraySize;
    unsigned char *before = NULL;
    unsigned short *after = NULL;
    ArraySize = 9;
    before = (unsigned char*) malloc(ArraySize*sizeof(unsigned char));
    for(i = 0; i<ArraySize; i++) before[i] = i+5; //to get some values in
    for (i = 0 ; i<ArraySize; i++) printf("\npre:%d\n",before[i]);
    after = foo( before, ArraySize ); 
    for (i = 0 ; i<ArraySize; i++) printf("\npost:%d\n",after[i]);
    return 0;

}

任何帮助提示或解释都会对我有很大帮助!非常感谢!!

4

3 回答 3

3

这是一个函数,其中所有奇怪的地方都固定为您期望它做的事情:

unsigned short* foo( unsigned char *array, int size) 
// notice the return type - it's a pointer
{
    int i;
    unsigned short *LeArray = NULL;
    LeArray = (unsigned short*) malloc(size*sizeof(unsigned short));
    for ( i = 0; i < size; ++i ) LeArray[i] = (unsigned short)(array[i]);
    //do more stuff to that array here before returning it
    return LeArray; // notice NO DEREFERENCING here
}

基本上这是您遇到的问题:

  • 函数的返回类型不是指针(不是数组)
  • 您正在做一个奇怪的指针杂技(我猜您正在更改代码,直到编译器停止抱怨)
  • 您在返回时取消引用了一个指针,本质上是返回数组第一个元素的值(而不是整个数组,如预期的那样)

当然,还有更多。即:

  • 看起来你的“in”数组没有改变 -在函数的签名中表达它是一个很好的做法const unsigned char* array
  • 您可以进一步更改函数的接口以获取结果数组的输入参数

在这种情况下,您可以执行以下操作:

void foo(const unsigned char *array, unsigned short* LeArray, int size) 
{
    int i;
    // no malloc as the LeArray is passed-in
    for ( i = 0; i < size; ++i ) LeArray[i] = (unsigned short)(array[i]);
    //do more stuff to that array here before returning it
    return; // void return
}

当然,假设数组是在调用函数中预先创建的

于 2012-07-28T22:22:17.010 回答
1

你快到了。

但是您应该返回 LeArray 本身(这是内存中的地址),而不是 *LeArray(这是第一个元素)。

于 2012-07-28T22:21:40.257 回答
1

after = foo( before, ArraySize );- 在这里,您正在调用函数foo并期望返回类型为unsigned short *,但函数foo正在返回unsigned short值。之后,您将访问指向函数内部unsigned short变量的指针,这可能会导致崩溃(意外行为)。aftermain

所以改变你的函数原型,unsigned short* foo( unsigned char *array, int size)然后做return LeArray;

于 2012-07-29T06:37:34.990 回答