数组直方图主要

时间:2014-01-15 10:52:59

标签: c arrays histogram

我正在研究这个非常简单的C程序,它从数组中构建直方图。特别是它在第二个数组上写入第一个数组的ciphres,然后是它们出现的次数。例如:如果数组A是{2,3,2,5,6,6,6},则A的数组直方图将是{2,2,3,1,5,1,6,3}。好的,所以我的程序编译得很好,没有任何警告或错误。但是在我插入数组A的值后程序停止工作。我在哪里失败?谢谢!!

typedef unsigned short int boolean;
#define TRUE 1
#define FALSE 0
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <conio.h>

boolean Array_Histogram(int *A, int N, int **H, int *count){
  int i,j;
  boolean found;
  *H = (int *) malloc( sizeof(int)*2*N );
  if(*H==NULL)
    return FALSE;
  (*count)=0;
  for(i=0;i<N;i++){
    found=FALSE;
    j=0;
    while(found==FALSE && j<(*count)*2){
      if(A[i]==(*H[j]))
        found=TRUE;
      else j+=2;
    }
    if(found==TRUE){
      (*H)[j+1]++;
    }
    else{
      (*H)[j] = A[i];
      (*H)[j+1] = 1;
      (*count) ++;

    }
  }
  return TRUE;
}


int main(){

  int N;
  int count;
  int *A;
  int **H;
  int *i;

  i=0;
  printf("Inserisci N, dimensione dell'array A:");
  scanf("%d", &N);
  if(N<=0){

    return 0;
  }
  A= (int*) malloc (sizeof(int)*N);
  *H = (int *) malloc( sizeof(int)*2*N );
  for(count=0;count<N;count++){
    printf("\n Inserisci il valore %d di A:", count);
    scanf("%d", &A[count]);
  }
  Array_Histogram(A,N,H,i);
  printf("\nI valori dell'istogramma sono:");
  for(count=0;count<2*N;count++)
    printf("\n %d", (*H)[count]);
  return 0;
}

3 个答案:

答案 0 :(得分:1)

main中的变量H的类型错误。应该声明:

int *H;

您需要在main中更改另外2行:

H = malloc( sizeof(int)*2*N );

Array_Histogram(A,N,&H,i);

此外,您只需要分配一次。

答案 1 :(得分:1)

我不确定你想要实现什么,但你的问题是解除引用null指针。

H是指向整数的双指针。因此,在使用H

之前,必须使用malloc将内存分配给*H
int **H;
*H = malloc( sizeof(int)*2*N );

编辑:

建议您阅读有关指针here

的一些基础知识

答案 2 :(得分:0)

  1. 您正在为H分配内存两次(一次在main中,一次在func中)。
  2. H被声明为int **,内存被分配给每个2 * N个整数指针元素,这可能不是你想要做的。 如果你只想输出{2,2,3,1 ..},那么你可能只想要一个int * H;