无法正常运行,代码总是崩溃

时间:2019-04-21 10:41:58

标签: c

我的代码崩溃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;
}`

2 个答案:

答案 0 :(得分:1)

您的代码有很多问题。

首先,您只能freemalloccallocrealloc分配的东西。这不适用于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。我建议您阅读入门手册以了解原因。