memcpy段错误与更大的数组

use*_*049 4 c memcpy multidimensional-array

我有一个函数,使用memcpy在C中交换2d数组.我知道你可以交换指针,但我想在复制数组和交换指针之间进行比较.

这是我的代码,2d数组是nx n.

void swap_arrays(int n, float old[][n], float new_arr[][n]) {
    float temp[n][n];
    int arr_size = sizeof(float) * n * n;
    memcpy(temp, old, arr_size);
    memcpy(old, new_arr, arr_size);
    memcpy(new_arr, temp, arr_size);
}
Run Code Online (Sandbox Code Playgroud)

它适用于5 x 5阵列,但是当阵列较大时(我需要的实际大小为4000+,它会在2000+处开始分段故障),在第一个memcpy时会出现段错误.任何帮助表示赞赏.

Iha*_*imi 6

它有4000个段落,但这不是memcpy()错.这是因为大小超过了程序的堆栈大小.

尝试动态分配数组,它应该工作正常,像这样

float *temp;
temp = malloc(sizeof(float) * n * n);
if (temp != NULL)
{
    /* memcpys here */
}
Run Code Online (Sandbox Code Playgroud)

请注意,与数组不同,这不能使用两个索引表示法来访问,以实现您需要的东西

float **temp;
temp = malloc(sizeof(float *) * n);
for (size_t i = 0 ; i < n ; ++i)
    temp[i] = malloc(sizeof(float) * n); /* please check for `NULL' */
Run Code Online (Sandbox Code Playgroud)

free()在这两种情况下都需要,而在第二种情况下,您的memcpy()工作将无法正常工作.因为每个元素temp都是指针而不是a float,所以首先需要访问指针然后复制数据memcpy().

  • 如何按以下方式分配数组:`float(*ptemp)[n] [n] = malloc(sizeof*ptemp);`它应该完全允许索引像`(*ptemp)[42] [42] = 42.42 ;`. (2认同)