我有一个2D动态数组。 我在一行后面输入一个0号线,其编号最大:
void InsertZero(int **a, int pos){
int i, j;
a = (int**)realloc(a, n * sizeof(*a));
a[n-1] = (int*)calloc(n, sizeof(**a));
d = 0;
for(i = n-1; i > pos; i--){
for(j = 0; j < n; j++){
a[i][j] = a[i-1][j];
printf("%d ", a[i][j]);
}
}
for(i = 0; i < n; i++){
a[pos][i] = 0;
}
}
如果我制作阵列3,5,7,9的大小......它可以正常工作。但是,如果有多行是2,4,6,......,那么当我尝试打印我的数组时,这是一个访问冲突错误:
void Print(void){
int i, j;
for(i = 0; i < (n-d); i++){
for(j = 0; j < n; j++){
printf("%d\t", arr[i][j]);
}
printf("\n");
}
}
答案 0 :(得分:0)
看着这个我无法理解......看看评论1,你有n
设置到realloc
某个内存区块a
类型为{int **
1}} - 一个双指针,你怎么调用这个函数?其次,评论2,为什么在先前调用双指针上的calloc
时调用realloc
?假设n
的值为5,则realloc
在双指针a
上调用,意味着a[0][1]..a[4][1]
,现在calloc
被调用a[4]
有一个新的记忆块...
void InsertZero(int **a, int pos){ int i, j; /* 1. */ a = (int**)realloc(a, n * sizeof(*a)); /* Bzzzzt....if realloc failed, a gets overwritten! */ /* 2. */ a[n-1] = (int*)calloc(n, sizeof(**a)); /* 3. */ d = 0; /* 4. */ for(i = n-1; i > pos; i--){ for(j = 0; j < n; j++){ a[i][j] = a[i-1][j]; printf("%d ", a[i][j]); } } for(i = 0; i < n; i++){ a[pos][i] = 0; } }
评论3,d
用于什么 - 无用变量?
注释4,如果[0][0]
的值为5,则假设内存块具有数组下标[4][4]
至n
!
你能澄清这一切吗?
修改:再次查看...当a
的来电失败时,realloc
可能会被覆盖!我建议使用此部分代码来抵消此
int **tmpA; tmpA = (int**)realloc(a, n * sizeof(*a)); if (tmpA != NULL){ a = tmpA; .... a[n-1] = (int*)calloc(n, sizeof(**a)); for(i = n-1; i > pos; i--){ .... } for(i = 0; i < n; i++){ .... } }
答案 1 :(得分:0)
在您的函数InsertZero
中,您有一个局部变量a
。该局部变量最初设置为指向整数的指针的地址(您可能需要指向整数数组的指针的地址,即int ***a
)。
当您致电realloc
时,您正在为a
指定一个指向内存块的指针的本地副本,但是一旦您完成了您的功能,您的本地副本a
完全可能1}}指向与程序其余部分不同的地方。你可能想说*a = (int **)realloc(a, n * sizeof(int *));
。
危险的是,你正在使用未传递给你的函数的n
。您似乎已经假设n
将比之前的数组大小大1 - 否则您对calloc
的调用是多余的,您只是旋转数组,让最后一个元素因内存泄漏而中断。
让我们使用一个更简单的例子,没有数组,没有维度。假设你想创建一个函数:
void make_me_a_pointer( int **mynumber ) {
*mynumber = (int *)malloc( sizeof(int) );
**mynumber = 7; /* assign the value 7 to my allocated memory */
}
int main( void ) {
int *demoint;
make_me_a_pointer( &demoint );
printf( "Magic num is %d\n", *demoint );
}
但是在您的情况下,您只是分配了a = realloc
...因此从未在您的职能范围之外传达a
的新地址。