C中的动态数组分配

时间:2014-10-07 18:48:03

标签: c arrays memory-management

代码正在运行,但是有错误。返回数组 使用通过引用返回此函数 - > void alloc(int ** array,int size)。您如何看待这个错误?

#include <stdio.h>
#include <stdlib.h>

void memoryys(int **array, int size);
int main()
{
    int i;
    int in;
    int *a1;

    printf("please number of elements  ");
    scanf("%d",in);
    alloc(&a1,in);

    for(i=0;i<in;i++){
       scanf("d ",&a1[i]);
    }
    free(a1);

    return 0;
}

void alloc(int **array, int size){
   int i;
   *array = (int *) malloc(size*sizeof(int));
   if (*array == NULL){
      printf("Error\n");
      exit(-1);
   }
}

2 个答案:

答案 0 :(得分:1)

您没有在scanf中指定变量的地址

scanf("%d",input1);

应该是

scanf("%d",&input1);

通常,最好使用fgets从键盘读取以对用户输入的内容进行某种控制。然后使用sscanf将值转换为您想要的类型。

char line[128];
if (fgets(line,sizeof(line), stdin) != NULL)
{
  if (sscanf(line,"%d", &n) == 1)
  {
    do something useful
  }
  else
  {
    puts("invalid input");
  }

}

答案 1 :(得分:0)

使用C中的数组,您实际上只是为特定数据类型分配一个连续的空间块,在这种情况下为int

在堆栈 上,创建了一个int数组,如下所示:
int array[2][6]; // 2x6例如,2个数组,每个6个整数(或2个,每个都有6个
概念 ,它可能看起来像行和列:

       0   1   2   3   4   5
0    |int|int|int|int|int|int|
1    |int|int|int|int|int|int|

实际上 ,在内存中,它只是一个足以容纳12 int的连续空间块:

|int|int|int|int|int|int|int|int|int|int|int|int|  

索引运算符:[]提供了一种访问元素的视觉上简单的方法,例如,
array [1] [3]代表第10个元素

对于在堆上创建的数组

int **array=0;

首先,创建必要的指针(由[2]表示)

array = malloc(sizeof(int *) * 2); //provide two pointers   

给你指针数组[0]&amp;阵列[1]

现在你可以为每个指针分配内存:(由[6]表示)

array[0] = malloc(sizeof(int)*6); //space for 6 ints   
array[1] = malloc(sizeof(int)*6); //space for 6 ints  

两个指针指向这些位置:

    |int|int|int|int|int|int|int|int|int|int|int|int|  
    ^ array[0]              ^ array[1]    

为您提供2D数组的表示:array[2][6];

完成后不要忘记释放所有内容,对于每个malloc,应该有一个免费的:

free(array[0]);    
free(array[1]);
free(array);