2015-09-14 5 views
3

Ниже приведена часть кода, на который я застрял. Я хочу, чтобы динамически выделять память дляРаспределение памяти для указателя на массив и массив указателя

  • Указателя на массив
  • массив указателей

Я получаю несколько сообщений об ошибках, как недопустимое преобразование из Int * в Int и так далее.

Указатель на массив

int (*array)[nrows][ncolumns]; 
array = (int*)malloc(nrows * ncolumns * sizeof(int)); 


printf("\n Enter the elements:\n"); 

for(i=0; i<nrows; i++) 
{ 
    for(j=0; j<ncolumns; j++) 
    { 
     scanf("%d", array[i][j]); 
    } 
} 

printf("Entered array is :\n\n"); 

for(i = 0;i<nrows; i++) 
{ 
    for(j = 0; j<ncolumns; j++) 
    { 
     if(j== ncolumns-1) 
     { 
      printf("%d \n", *array[i][j]); 
     } 
     else 
     { 
      printf("%d", *array[i][j]); 
     } 

Массив указателей

int *array[nrows][ncolumns]; 
array[nrows][ncolumns] = (int*)malloc(nrows * ncolumns * sizeof(int)); 

printf("Enter elements:\n"); 

for(i = 0; i<nrows; i++) 
{ 
    for(j = 0; j<ncolumns;j++) 
    { 
     scanf("%d",&array[i][j]); 


    } 
} 


printf("Entered array is: \n"); 
for(i = 0; i<nrows; i++) 
{ 
    for(j = 0; j<ncolumns;j++) 
    { 
     if(j == ncolumns-1) 
     { 
      printf("%d \n",array[i][j]); 
     } 
     else 
     { 
      printf("%d \t",array[i][j]); 
     } 


    } 
} 
+2

Я рекомендую вам начать с одномерными массивами, пока вы не знакомы с разницей между массивами и указателями, и разница заключается в указателе на массив и указателе на первый элемент массива. Кроме того, вы избегаете «malloc» этих вещей, пока не сможете написать код без него. – molbdnilo

+0

Спасибо. Но на самом деле у меня не так много времени. Я должен исправить это через 1 час. Пожалуйста, помогите мне. Правильно ли выделена часть распределения памяти? – SKD

+2

@Sujit Ну, вам следовало начать учиться раньше. Подсказки: В 1) 'array [i]' - двумерный массив, 'array [i] [j]' - это одномерный массив. В 2) 'array [i] [j]' является (неинициализированным) указателем, а не 'int'. – molbdnilo

ответ

4

1> указатель на массив

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

int main(void){ 
    int nrows = 3; 
    int ncolumns = 4; 
    int i, j; 

    int (*array)[nrows][ncolumns];//do you want <<int (*array)[ncolumns]>> ? 
    //like as int src[nrows][ncolumns]; array = &src; 
    array = malloc(nrows * ncolumns * sizeof(int));//(int*) : type mismatch 

    printf("\nEnter the elements:\n"); 

    for(i = 0; i<nrows; i++){ 
     for(j = 0; j<ncolumns; j++){ 
      scanf("%d", &(*array)[i][j]); 
     } 
    } 

    printf("Entered array is :\n\n"); 

    for(i = 0; i<nrows; i++){ 
     for(j = 0; j<ncolumns; j++){ 
      if(j != 0) 
       putchar(' '); 
      printf("%d", (*array)[i][j]);//need () 
     } 
     putchar('\n'); 
    } 
    free(array); 
    return 0; 
} 

2> Массив указателей

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

int main(void){ 
    int nrows = 3; 
    int ncolumns = 4; 
    int i, j; 

    int *array[nrows][ncolumns]; 
    int *src = (int*)malloc(nrows * ncolumns * sizeof(int));//no need (int*) 

    printf("Enter elements:\n"); 

    for(i = 0; i<nrows; i++){ 
     for(j = 0; j<ncolumns;j++){ 
      array[i][j] = &src[ i * ncolumns + j];//pointer pointed to entity (src[ i * ncolumns + j]) 
      scanf("%d", array[i][j]);//type of array[i][j] is int * 
     } 
    } 

    printf("Entered array is: \n"); 
    for(i = 0; i<nrows; i++){ 
     for(j = 0; j<ncolumns; j++){ 
      if(j != 0) 
       putchar(' '); 
      printf("%d", *array[i][j]);//need * for dereference 
     } 
     putchar('\n'); 
    } 

    free(src); 
    return 0; 
} 

3> Опция

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

int main(void){ 
    int nrows = 3; 
    int ncolumns = 4; 
    int i, j; 

    int (*array)[ncolumns]; 
    array = (int (*)[ncolumns])malloc(nrows * sizeof(*array));//sizeof(*array) : sizeof(int[ncolumns]) 

    printf("\nEnter the elements:\n"); 

    for(i = 0; i<nrows; i++){ 
     for(j = 0; j<ncolumns; j++){ 
      scanf("%d", &array[i][j]); 
     } 
    } 

    printf("Entered array is :\n\n"); 

    for(i = 0; i<nrows; i++){ 
     for(j = 0; j<ncolumns; j++){ 
      if(j != 0) 
       putchar(' '); 
      printf("%d", array[i][j]); 
     } 
     putchar('\n'); 
    } 
    free(array); 
    return 0; 
} 
+0

Большое спасибо. Это действительно помогло. Хотя в 1-й программе M все еще получает ошибку «Преобразование типа». – SKD

+1

@Sujit Возможно, вы используете компилятор C++ в качестве компилятора C. (cast from 'void *' no need in C), попробуйте 'array = (int (*) [nrows] [ncolumns]) malloc (nrows * ncolumns * sizeof (int));' – BLUEPIXY

+0

Я использую компилятор Dev-C++ , Еще раз спасибо. Теперь обе прогры работают хорошо. – SKD

Смежные вопросы