1

此处的相关线程:C99 是否保证数组是连续的?

显然answer()在下面无效,但可以重写以使用 char * 或强制转换为 int[nElements] (可能)。我承认我不理解标准参考以及为什么如果正确对齐,则无法通过 int* 访问连续的 int 块。

首先,以下代码块在大多数 C++ 平台上是否有效?

void answer(int *pData, size_t nElements)
{
    for( size_t i=0; i<nElements; ++i )
        pData[i] = 42;
}

void random_code()
{
    int arr1[1][2][3][4];               // local allocation
    answer(arr1, sizeof(arr1) / sizeof(int));
    int arr2[20][15];
    answer(arr2, sizeof(arr2) / sizeof(int));
}

第二个answer()对所有分配类型(全局、本地、堆(希望是正确的!))仍然有效?

int g_arr[20][15]; // global
void foo() {
    int (*pData)[10] = new int[50][10];  // heap allocation, at least partially
    answer(&pData[0][0], 50*10);
    // not even sure if delete[] will free pData correctly, but...
}
4

3 回答 3

1

里面的代码answer()很好。中的代码random_code()滥用answer()(或未调用answer()问题中显示的重载)。它应该是:

void random_code()
{
    int arr1[1][2][3][4];
    answer(&arr1[0][0][0][0], sizeof(arr1) / sizeof(int));
    int arr2[20][15];
    answer(&arr2[0][0], sizeof(arr2) / sizeof(int));
}

中的代码answer()需要一个int *; 您正在传递 anint (*)[2][3][4]和 an int (*)[15],两者都不像int *.

这对于分配单个连续数据块的其他分配机制仍然有效,例如所示的那些。

于 2013-11-08T15:40:51.387 回答
1

是的,大多数平台确实会以这样一种方式打包 N 维数组的元素,即指向第一个元素的指针上的线性寻址将找到所有元素。

实际上很难(如,我无法弄清楚)提出一个不这样做的符合标准的实现因为数组数组必须打包所述数组,并且数组数组的大小是每个子数组乘以数组的数组数。它似乎没有不工作的空间。甚至每个元素的顺序似乎都被很好地定义了。

尽管如此,我所知道的标准中的任何条款实际上都不允许您将指向多维数组的第一个元素的指针重新解释为指向产品数组的指针。许多子句都讨论了如何只能访问数组的元素,或者只能访问数组的元素。

于 2013-11-08T15:42:55.313 回答
0

正如前人所说,您的代码中存在类型错误。您正在尝试将 int ( )[X] 类型的实际参数用于 int形式参数。所以为了让你的代码工作,你应该使用类型转换。

C++/C 对数据类型使用相同的内存布局,而不取决于用于分配对象的内存部分,因此相同的代码可以用于它们所在的值。因此,第二个问题的答案是,如果您的代码正在处理堆栈分配的值,那么它也将使用堆分配的值。

于 2013-11-08T15:44:39.940 回答