所以我有以下功能。该函数采用目标int **双指针并将源数组复制到它。
void copyMatrix(int ** target, int m, int n, int source[m][n])
{
int i,j;
target = (int **) malloc(m * sizeof(int *));
for (i = 0; i < m; i++)
target[i] = (int *)malloc(n * sizeof(int));
for(i=0; i < m; i++){
for(j=0; j < n; j++){
target[i][j] = source[i][j];
}
}
printf("%d ", target[i][j]);
}
当我在for循环后调用printf时,我得到一个段错误,但如果我在for循环中调用printf,它会正确打印target [i] [j]。为什么是这样?我正在把头发撕掉......
答案 0 :(得分:1)
循环后,i == m
和j == n
。他们都指出1项超过最大值。 C中的数组是零索引的,因此访问大小为target[n][m]
的数组的[n][m]
将提供越界访问。
答案 1 :(得分:0)
我不清楚你为什么要先创建一个指针数组。使用这种方法,您最终会遇到修改双指针本身的问题,而这不会反映在调用者中。您可以直接分配一个数组来存储输入的2D数组。
您的代码:
void copyMatrix(int ** target, int m, int n, int source[m][n])
{
int i,j;
target = (int **) malloc(m * sizeof(int *));
for (i = 0; i < m; i++)
target[i] = (int *)malloc(n * sizeof(int));
for(i=0; i < m; i++){
for(j=0; j < n; j++){
target[i][j] = source[i][j];
}
}
printf("%d ", target[i][j]);
}
修改后的代码:
void copyMatrix(int ** target, int m, int n, int source[m][n])
{
int i,j;
*target = (int *) malloc(sizeof(int) * (m * n));
for(i=0; i < m; i++){
for(j=0; j < n; j++){
(*target)[i][j] = source[i][j];
}
}
printf("%d ", (*target)[i][j]);
}