【问题标题】:initialize array passed by pointer初始化指针传递的数组
【发布时间】:2011-10-17 22:56:38
【问题描述】:

函数无法初始化数组,因为 sizeof() 返回 int pointer 的字节 不是myArray 指向的内存大小。

 void assignArray(int *myArray)
 {
     for(int k = 0; k < sizeof(myArray); ++k)
     {
         myArray[k] = k;
     }
 }

还有其他问题吗?

谢谢

【问题讨论】:

  • 你还有什么期待吗?
  • “除此之外,《林肯夫人》这部戏怎么样?”
  • 最好先解决这个大问题,然后再考虑新修复的版本是否还有其他问题。
  • 这些 cmets 是否对 OP 有用?他讲了一个问题,比较好(我明白他的意思),他显然没有你们知道的那么多,但你认为开玩笑可以吗?!?真的很酷的家伙..

标签: c++ arrays function pointers initialization


【解决方案1】:

没有,没有其他问题。您所说的问题是唯一阻止您初始化数组的问题。

通常,只需将大小与指针一起传递即可解决:

void assignArray(int* myArray, std::size_t mySize)
{
    for (std::size_t k = 0; k < mySize; ++k)
        myArray[k] = k;
}

请注意,我使用 std::size_t 作为大小,因为这是存储大小的标准类型(它将是 8 字节的 64 位机器,而 int 通常不是)。

在某些情况下,如果大小是静态已知的,那么您可以使用模板:

template <std::size_t Size>
void assignArray(int (&myArray)[Size])
{
    for (std::size_t k = 0; k < Size; ++k)
        myArray[k] = k;
}

但是,这只适用于数组,而不是指向已分配数组的指针。

int array1[1000];
int* array2 = new int[1000];
assignArray(array1); // works
assignArray(array2); // error

【讨论】:

    【解决方案2】:

    我没有看到其他问题。但是,您可能想要这样:

    template<int sz>
    void assignArray(int (&myArray)[sz])
    {
        for(int k = 0; k < sz; ++k)
        {
            myArray[k] = k;
        }
    }
    

    当然,除非编译器在编译时也不知道它有多大。在这种情况下,您必须明确传递大小。

    void assignArray(int* myArray, size_t sz)
    {
        for(int k = 0; k < sz; ++k)
        {
            myArray[k] = k;
        }
    }
    

    如果不知道尺寸,则说明您存在设计错误。

    http://codepad.org/Sj2D6uWz

    【讨论】:

    • 但是如果 OP 正在分配数组,这将不起作用
    • 该死——比我快 30 秒!
    • @Praetorian:我从上面的代码中假设他做到了。我发布了答案的后半部分。
    【解决方案3】:

    您应该能够区分两种类型的数组。一个看起来像这样:

    type name[count];
    

    此数组的类型为type[count],每个count 的类型都不同。虽然它可以转换为type *,但它是不同的。一个区别是sizeof(name) 给你count*sizeof(type)

    另一种类型的数组如下所示:

    type *name;
    

    这基本上只是一个指针,您可以使用数组初始化,例如使用mallocnew。这个变量的类型是type *,如你所见,类型中没有count信息。因此,sizeof(name) 为您提供计算机中指针的大小,例如 4 或 8 个字节。

    你问为什么这两个sizeofs 不同?因为sizeof 是在编译时评估的。考虑以下代码:

    int n;
    cin >> n;
    type *name = new type[n];
    

    现在,当您说sizeof(name) 时,编译器无法知道n 的可能未来值。因此,它不能将sizeof(name) 计算为数组的实际大小。此外,name 指针甚至可能不指向数组!

    请问您应该怎么做?简单的。将数组的大小保存在一个变量中,然后将其拖动到您获取数组的任何位置。所以在你的情况下,它会是这样的:

    void assignArray(int *myArray, int size)
    {
        for(int k = 0; k < size; ++k)
        {
            myArray[k] = k;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      相关资源
      最近更新 更多