我有一个函数可以使用 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/