我编写了c程序,它读取方阵的数字并将它们存储在2d动态数组中以便稍后找到某些特定点。现在,一切都很顺利,直到我收到将所有存储的数字移动到新的1d动态数组的任务。此时,程序在尝试访问分配新数组内存并向其移动数字的函数时崩溃。因为我不仅是新手,而且是整体编程,任何反馈都会受到赞赏。
现在这是应该分配新数组
的内存的函数void perkelimas(int ***matrica, int *n, int **matrica2)
{
int naujas_dydis = (*n)*(*n);
printf("%i dydis \n", naujas_dydis);
*matrica2 = malloc(naujas_dydis*sizeof(int));
int w;
int b = 0;
int c = 0;
for(w = 0; w < naujas_dydis; w++)
{
printf("%i \n", w);
printf("b = %i, c = %i \n", b, c);
if(c < *n)
{
*matrica2[w] = *matrica[b][c];
printf("%i \n", *matrica2[w]);
c++;
}
if (c == *n)
{
c = 0;
b++;
}
}
}
这是主要功能
int main()
{
int *n;
int i,j;
int **matrica;
int *matrica2 = NULL;
atmintis(&matrica, n);
i = 0;
j = 0;
int k = 0;
while(i < *n)
{
while(j < *n)
{
printf("iveskite tasko dydi: \n"); // this is where user inputs matrix numbers
scanf("%i", &matrica[i][j]);
j++;
}
i++;
j = 0;
}
i = 0;
j = 0;
int m = 0;
int l = 0;
printf("matrica: \n");
while (l < *n)
{
while (m < *n)
{
printf("%i", matrica[l][m]);
printf(" ");
m++;
}
printf("\n");
m = 0;
l++;
}
printf("\n");
printf("balno tasku koordinates: \n");
while (i < *n)
{
while (j < *n)
{
int x,y;
x = j+1;
y = i+1;
if(tikrinimas(i, j, *n, matrica) == 1)
{
printf("%i", x);
printf(" ");
printf("%i", y);
printf("\n");
}
j++;
}
j = 0;
i++;
}
perkelimas(matrica, n, matrica2);
for(i = 0; i < *n; i++)
{
free(matrica[i]);
}
return 0;
}
这里是分配2d数组内存的函数
void atmintis(int ***matrica, int *n)
{
printf("Iveskite matricos ilgi ir ploti: ");
scanf("%i", &(*n)); // length and width of matrix
int q;
(*matrica) = (int**)malloc((*n)*sizeof(int));
for (q = 0 ; q < *n ; q++)
{
(*matrica)[q] = (int*)malloc((*n)*sizeof(int));
}
}
提前感谢您提供任何帮助
答案 0 :(得分:0)
有一些事情需要修改:
正如@rodrigo所指出的sizeof(int*)
可能与sizeof(int)
不同,例如在64位平台上。
n
是int*
,指向int的指针,指向某处。这个地方永远不会分配。这会导致未定义的行为。它可能会触发分段错误。为防止出现这种情况,n
可以是int
,函数使用&n
,指向n
。
函数perkelimas()
需要指向2D矩阵的指针和指向数组的指针。
perkelimas(matrica, &n, matrica2);
应为perkelimas(&matrica, &n, &matrica2);
在函数perkelimas()
中,可以添加brakets:
(*matrica2)[w] = (*matrica)[b][c];
free(matrica)
和free(matrica2)
以下是代码:
#include <stdio.h>
#include <stdlib.h>
void atmintis(int ***matrica, int *n)
{
printf("Iveskite matricos ilgi ir ploti: ");
scanf("%i", &(*n)); // length and width of matrix
int q;
(*matrica) = (int**)malloc((*n)*sizeof(int*));
for (q = 0 ; q < *n ; q++)
{
(*matrica)[q] = (int*)malloc((*n)*sizeof(int));
}
}
void perkelimas(int ***matrica, int *n, int **matrica2)
{
int naujas_dydis = (*n)*(*n);
printf("%i dydis \n", naujas_dydis);
*matrica2 = malloc(naujas_dydis*sizeof(int));
int w;
int b = 0;
int c = 0;
for(w = 0; w < naujas_dydis; w++)
{
printf("%i \n", w);
printf("b = %i, c = %i \n", b, c);
if(c < *n)
{
(*matrica2)[w] = (*matrica)[b][c];
printf("%i \n", (*matrica2)[w]);
c++;
}
if (c == *n)
{
c = 0;
b++;
}
}
}
int main()
{
int n;
int i,j;
int **matrica;
int *matrica2 = NULL;
atmintis(&matrica, &n);
i = 0;
j = 0;
int k = 0;
while(i < n)
{
while(j < n)
{
printf("iveskite tasko dydi: \n"); // this is where user inputs matrix numbers
scanf("%i", &matrica[i][j]);
j++;
}
i++;
j = 0;
}
i = 0;
j = 0;
int m = 0;
int l = 0;
printf("matrica: \n");
while (l < n)
{
while (m < n)
{
printf("%i", matrica[l][m]);
printf(" ");
m++;
}
printf("\n");
m = 0;
l++;
}
printf("\n");
printf("balno tasku koordinates: \n");
while (i < n)
{
while (j < n)
{
int x,y;
x = j+1;
y = i+1;
/* if(tikrinimas(i, j, *n, matrica) == 1)
{
printf("%i", x);
printf(" ");
printf("%i", y);
printf("\n");
}*/
j++;
}
j = 0;
i++;
}
perkelimas(&matrica, &n, &matrica2);
for(i = 0; i < n; i++)
{
free(matrica[i]);
}
free(matrica);
free(matrica2);
return 0;
}
通过将指针传递给int n
和指向2D矩阵matrica
的指针来执行分配,您做得很好:此函数将修改n
和matrica
的值。函数void perkelimas(int ***matrica, int *n, int **matrica2)
不是这种情况:此函数不会修改matrica
或n
。所以void perkelimas(int **matrica, int n, int **matrica2)
就足够了。由于matrica2
被修改(在此处分配),因此需要将指针传递给数组matrica2
。