我的代码崩溃coz free()不想清除数组。首先,我创建数组并添加一个数字。之后,我输入K(k `int main() {
while(1){
int m,k;
printf("Enter size of array: ");
int res;
do
{
res=scanf("%d",&m);
if(res!=1)printf("it should be a number!");
}
while(res!=1);
int * a = (int*) malloc(m*sizeof(int));
int i;
for (i = 0; i < m; i++)
{
printf("a[%d] = ", i);
do
{
res=scanf("%d", &a[i]);
flush();
if(res!=1) printf("it should be a number!\n");
}
while(res!=1);
}
for (i = 0; i < m; i++)
printf("%d ", a[i]);
printf("\nEnter K: ");
do
{
res=scanf("%d",&k);
flush();
if(res!=1 || k>m) printf("k<m must be or enter number\n");
}
while(res!=1 || k>m);
int all=k*m;
for(i=m;i<all;i++)
{
a[i] = 0;
}
int j;
int n=0;
int s[i][j];
for(i=0;i<m;i++)
{
for(j=0;j<k;j++)
{
s[i][j] = a[n];
printf("%d ",s[i][j]);
n++;
}
printf( "\n" );
}
for(i=0;i<m;i++)
{
for(j=0;j<k;j++)
{
free(s[i][j]);
}
}
int povtor; ----- exit using break
char temp[10];
printf("Continue?(1 - No, everything - Yes): ");
gets(temp);
povtor = atoi(temp);
if (povtor == 1 ) break;
}
return 0;
}`
答案 0 :(得分:1)
您的代码有很多问题。
首先,您只能free
用malloc
,calloc
或realloc
分配的东西。这不适用于s[i][j]
。
但这只是一个问题。您分配a
来容纳m
个元素:
int * a = (int*) malloc(m*sizeof(int));
,但是您尝试在此处写完数组的末尾:
int all=k*m;
for(i=m;i<all;i++)
{
a[i] = 0;
}
您需要先调整a
的大小,然后再尝试重写,否则将覆盖您不拥有的内存:
int *tmp = realloc(a, sizeof *a * all );
if ( !tmp )
{
// resize failed, exit with error
}
a = tmp;
for( i = m; i < all; i++ )
{
a[i] = 0;
}
然后是这个:
int j;
int n=0;
int s[i][j];
此时j
的值是多少?因此,i
的值是什么?您确定不是故意s[m][k]
吗?
答案 1 :(得分:0)
您要释放一个int,而不是一个指针:int s[i][j]
是int
数组的数组,因此s[][]
是int。
尽管,s是自动分配的内存:基本上,它是一个存储在 stack 中的变量,因此您无需释放它。尝试释放静态变量会导致崩溃。 This question可能会对您有所帮助。
顺便说一句,您有很多未初始化的变量,从而导致条件跳转和可能的崩溃:例如,您声明int j
不带值,并在使用它声明数组数组之后。
最后,不要使用gets。此功能很危险,请改用fgets。我建议您阅读入门手册以了解原因。