c - 具有较大数组的 memcpy 段错误

标签 c multidimensional-array memcpy

我有一个函数可以使用 memcpy 在 C 语言中交换二维数组。我知道您可以交换指针,但我想比较一下复制数组和交换指针。

这是我的代码,二维数组是 n x 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);
}

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

最佳答案

它出现 4000 段错误,但这不是 memcpy() 的错误。这是因为大小超过了程序的堆栈大小。

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

float *temp;
temp = malloc(sizeof(float) * n * n);
if (temp != NULL)
{
    /* memcpys here */
}

请注意,与数组不同,这不能用两个索引符号访问,要实现这一点,您需要类似的东西

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' */

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

关于c - 具有较大数组的 memcpy 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32448081/

相关文章:

c - 我是否要更改函数中的原点指针地址?

python - Python 中多维矩阵(数组)的乘法

c - 结构中动态数组的内存损坏?

c - 使用TCP从服务器下载文件

将字符串转换为 float

c - 在不同的 gcc 优化级别上,手动优化代码的效果是否一致?

c - 如何在 C 中定义和使用位数组?

Javascript 测试数组(网格)的 Angular 点

c++ - 如何使C++类在内存中具有特定的大小

c - 从索引 1 开始的错误 memcpy