【问题标题】:Output Crash in array数组中的输出崩溃
【发布时间】:2013-05-21 12:56:08
【问题描述】:

数组在代码中定义 我们应该计算数组中正数的数量 并创建一个新数组并在其中插入所有正数,如果正数 原始数组中的负数大于原始数组中的负数 如果相反(负数大于正数,我们创建一个新数组并插入所有负数)

如果相等(正数和负数) 我们创建一个新数组并首先插入所有正数,然后插入所有负数

*我们必须在函数中用malloc创建数组..

代码:

#include <stdio.h>
#define n 10
void func(int *arr)
{
    int i,j,c1=0,c2=0,mat;
    for(i=0;i<n;i++)
    {
        if (*arr>=0) c1++;
        else c2++;
        arr++;
    }
    if(c1>c2)
    {
        mat=(int *)malloc(c1*sizeof(int));
        for(i=0;i<c1;i++)
        if(*arr>0)
        {
         mat=*arr;
         mat++;
         arr++;
        }
    }
        else   if(c2>c1)
     {
        mat=(int *)malloc(c2*sizeof(int));
        for(i=0;i<c2;i++)
        if(*arr<0)
        {
         mat=*arr;
         mat++;
         arr++;
        }
    }
    else
    {
        mat=(int *)malloc((c1+c2)*sizeof(int));
        for(i=0;i<n;i++)
        if(*arr>0)
        {
         mat=*arr;
         mat++;
         arr++;
        }
        for(i=0;i<n;i++)
        if(*arr<0)
        {
         mat=*arr;
         mat++;
         arr++;
        }
    }
}
main()
{
    int array={6,3,5,-5,4,3,-6,-9,6,-16};
    int *arr=array;
    func(arr);
}

【问题讨论】:

  • 这是声明中mat 的错字吗?当你声明它时它应该是*mat,以便它是一个指针。
  • 你的代码有很多问题,比如malloc返回被分配给一个整数,main中的数组大小没有定义。如果不是错字请解释一下。
  • 如果您在编译时启用警告(-Wall 用于 gcc;/W4 用于 MSVC),编译器将指出代码中的各种错误
  • 代码一团糟。您使用的算法不能满足您的要求,并且其中有几个错误。我会把它全部废弃并重新开始。

标签: c arrays sorting output


【解决方案1】:

我认为它现在正在工作,并进行了以下修改(同时试图保持你的整个想法):1. mat 是 int* 而不是 int,也返回并释放 2. 对数组的索引访问而不是指针算术(并且丢失arr 指针,例如) 3. 更多测试用例。

我希望这是一个好的解决方案,祝你好运!

#include <stdio.h>
#include <malloc.h>

#define n 10
int* func(int *arr, int* size)
{
int i,j=0,c1=0,c2=0;
int* mat;
for(i=0;i<n;i++)
{
    if (arr[i]>=0) c1++;
    else c2++;
    //arr++;
}
if(c1>c2)
{
    *size = c1;
    mat=(int *)malloc(c1*sizeof(int));
    for(i=0;i<n;i++)
    if(arr[i]>=0)
    {
     mat[j]=arr[i];
     //mat++;
     //arr++;
     j++;
    }
}
    else   if(c2>c1)
 {
     *size = c2;
    mat=(int *)malloc(c2*sizeof(int));
    for(i=0;i<n;i++)
    if(arr[i]<0)
    {
     mat[j]=arr[i];
     //mat++;
     //arr++;
     j++;
    }
}
else
{
    *size = c1+c2;
    mat=(int *)malloc((c1+c2)*sizeof(int));
    for(i=0;i<n;i++)
    if(arr[i]>=0)
    {
     mat[j]=arr[i];
     //mat++;
     //arr++;
     j++;
    }
    for(i=0;i<n;i++)
    if(arr[i]<0)
    {
     mat[j]=arr[i];
     //mat++;
     //arr++;
     j++;
    }
}

    return mat;
}
void main()
{
//int array[n]={6,3,5,-5,4,3,-6,-9,6,-16};
//int array[n]={6,-2,-5,4,3,-6,-9,6,-16, -1};
int array[n]={-6,3,5,-5,4,3,-6,-9,6,-16};
int *arr=array;
int size;
int* mat = func(arr, &size);
for (int i = 0; i < size; ++i)
    printf("%d ", mat[i]);
printf("\n");
free(mat);
}

【讨论】:

    【解决方案2】:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define N 10
    
    int *func(int *arr, int *size){//arr: input array, size : size of array, I/O
        int *ap, *an, *mat;//array positive, array negative, return value;
        int psize, nsize;//size of positive array, size of negative array 
        int i;
    
        ap = (int*)malloc(*size * sizeof(int));//check return value, omission
        an = (int*)malloc(*size * sizeof(int));
        psize = nsize = 0;
        for(i=0;i < *size;++i){
            if(arr[i]>=0){
                ap[psize++] = arr[i];
            } else {
                an[nsize++] = arr[i];
            }
        }
        if(psize > nsize){
            mat = realloc(ap, sizeof(int)*psize);
            *size = psize;
            free(an);
        } else if(psize < nsize){
            mat = realloc(an, sizeof(int)*nsize);
            *size = nsize;
            free(ap);
        } else {
            mat = ap;
            for(i=0;i<nsize;++i)
                mat[psize + i] = an[i];
            //*size = *size
            free(an);
        }
        return mat;
    }
    
    int main(void){
        int array[N] = {6,3,5,-5,4,3,-6,-9,6,-16};
        int *arr, size = N;
        int i;
    
        arr=func(array, &size);//need size of the returned array
    
        for(i=0;i<size;++i){
            printf("%d ", arr[i]);
        }
        free(arr);
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      这个程序有 2 个最常见的编程错误。

      1.) mat=(int *)malloc(c1*sizeof(int));

      mat 被声明为整数。 malloc 返回一个指向已分配内存的 void 指针,然后您将其类型转换为整数指针。因此mat 应该是指向整数而不是整数的指针。 mat 的声明如下。

      int *mat;

      2.) arr++;

      使用数组索引来访问数组而不是数组算术运算。

      使用数组运算arr 将指向数组的末尾。接下来,当您增加arr 时,它会尝试访问可能导致崩溃的数组边界之外的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 1970-01-01
        • 2022-06-11
        • 1970-01-01
        • 2011-03-20
        • 2019-02-22
        • 1970-01-01
        相关资源
        最近更新 更多