2010-09-17 2 views
0

Я хочу сканировать 2D-массив с помощью указателей и написали этот код, не могли бы вы рассказать мне, почему компилятор дает ошибки?Двойной массив через указатели в C

#include<stdio.h> 
#include<stdlib.h> 
int main(void) { 
    int i,j,n,a,b; 
    int (*(*p)[])[]; 
    printf("\n\tEnter the size of the matrix in the form aXb\t\n"); 
    scanf("%dX%d",&a,&b); 
    p=(int (*(*p)[b])[a])malloc(b*sizeof(int (*p)[a])); 
    for(i=0;i<b;i++) { 
      p[i]=(int (*p)[a])malloc(a*sizeof(int)); 
      printf("\t\bEnter Column %d\t\n"); 
      for(j=0;j<a;j++) 
        scanf("%d",&p[i][j]); 
    } 
    return 0; 
} 
+0

Какие ошибки вы получаете? Какой компилятор вы используете? Вы строите это как C или C++? – bta

+0

Не забудьте «освободить» все объекты, на которые вы выделили память. – pmg

+0

Вы понимаете, что такое указатель? Из этого кода кажется, что вы думаете, что это массив, из 'int (* (* p) []) [];', что совершенно неверно. – alternative

ответ

2

Это довольно искаженный синтаксис. Обычно, когда вы делаете 2D массив:

  • Декларация просто int *p;
  • Распределение просто p = malloc(a*b*sizeof(int));
  • Вы не можете написать p[i][j]. Вы должны сделать одну из нескольких вещей: либо сделать дополнительный массив int **q, содержащий указатели строк, чтобы иметь возможность писать q[i][j] (более высокая производительность и удобочитаемость), либо написать p[b*i + j] (меньше шагов).

Кроме того, обратите внимание, что:

  • Вашего Printf извергнет мусор из-за недостающий параметр% г.
  • Поскольку C не является типичным, использование scanf спрячет любые ошибки в косвенности, которые вы можете сделать.

О ближе всего я мог думать о том, что отдаленно напоминает то, что вы пытаетесь сделать:

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

int main() 
{ 
    int i, j; 

    const int a = 3, b = 4; 
    int m[4][3]; 
    int (*p[4])[3]; 

    for (i = 0; i < b; i++) 
    { 
     p[i] = &m[i]; 
     printf("\t\bEnter Column %d\t\n", i); 
     for (j = 0; j < a; j++) 
     { 
      int x; 
      scanf("%d", &x); 
      (*p[i])[j] = x; 
     } 
    } 
    return 0; 
} 

Он собирает и функции, как и ожидалось, но это бесцельно сложнее. p - массив указателей на массивы.

+0

Я написал то же самое «искаженное синтаксис», когда вы разместили свой ответ. И действительно, n0nChun прочитал его ответ, он не просто явно дает вам код, а фактический способ понять это. И, пожалуйста, работайте над форматированием кода и вашим стилем кодирования, это будет скорее причиной получения таких ошибок/ошибок. – Yonathan

+0

@Yon: Я не другой способ сделать это, я просто экспериментировал с этим. – n0nChun

+0

@ Реин: Я действительно хотел знать, что не так с кодом, который я написал, а не о том, как обойти его, чтобы решить проблему. – n0nChun

2

Это утверждение имеет несколько проблем:

p=(int (*(*p)[b])[a])malloc(b*sizeof(int (*p)[a])); 

Во-первых, malloc возвращает void*. Вы используете этот указатель, используя (int (*(*p)[b])[a]), который дает значение, а не тип данных. Это не допустимый бросок, поэтому одна из причин, по которой компилятор кричит на вас. На данный момент p не был инициализирован, поэтому де-ссылка здесь может привести к сбою вашей программы, если этот оператор был выполнен.

В вашем malloc звоните, вы используете sizeof(int (*p)[a]). Заявление int (*p)[a] не является допустимым выражением C.

Кажется, что вы делаете это немного сложнее, чем это должно быть. Существует два способа построения 2D-массива. Вы можете построить массив, используя malloc(a * b * sizeof(int)), как объясняет Рейндинен. Вы также можете построить 1D массив указателей, каждый из которых указывает на массив типа int. Из вашего кода кажется, что вы пытаетесь сделать последнее.

Чем проще способ сделать это было бы что-то вроде этого:

int **p; 
... get input from user ... 
// Declare an array of int pointers of length b 
p = malloc(b * sizeof(int*)); 

// For each int* in 'p' ... 
for (i = 0; i < b; ++i) { 
    // ... allocate an int array of length 'a' and store a pointer in 'p[i]' .. 
    p[i] = malloc(a * sizeof(int)); 
    // ... and fill in that array using data from the user 
    printf("\t\bEnter Column %d\t\n"); 
    for(j = 0; j < a; j++) 
     scanf("%d", &p[i][j]); 
} 

Используя этот метод построения 2D массива позволяет использовать синтаксис p[x][y]. Поскольку p является указателем на указатель, p[x] является указателем на массив, а p[x][y] - это элемент в массиве с указателем.

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