что делает следующий код C ++ - PullRequest
0 голосов
/ 09 июля 2011

Я знаю, это очень наивный вопрос, но я не могу понять, что делает следующий код.

#include <malloc.h>
#define MAXROW 3
#define MAXCOL 4
int main(){
int (*p)[MAXCOL];
p = (int (*)[MAXCOL])malloc(MAXROW*sizeof(*p));
}

Пожалуйста, предоставьте полное объяснение, включая тип и размер p.

It is just for learning purpose. I am not using this code in any real application.

Ответы [ 5 ]

5 голосов
/ 09 июля 2011

Насколько я могу судить, это бред.Вы, вероятно, имели в виду (int(*)[MAXCOL]).

В C это означает, что программист, написавший его, не знает, как работают типы пустых указателей.

В C ++ это означает, что вы выделяете массивмассивы.p - это указатель на массив, поэтому * p - это массив размера MAXCOL, и вы выделяете MAXROW для таких массивов.В результате получается «искаженный» 2D-массив.Преимущество использования этого довольно неясного синтаксиса состоит в том, что вы получаете двумерный массив, в котором каждая ячейка находится в смежной памяти, чего вы бы не достигли с помощью более распространенного динамического двумерного массива указатель-указатель.

4 голосов
/ 09 июля 2011

Предположим, вы имели в виду некомментированную строку (другая - оригинал, который не является допустимым C)

// p = (*)[MAXCOL]malloc(MAXROW*sizeof(*p));
p = (int(*)[MAXCOL])malloc(MAXROW*sizeof(*p));

мой ответ:

В C не приводите возвращаемое значение malloc. Это в лучшем случае избыточно и может скрывать ошибку, когда присутствует. Просто сделай

p = malloc(MAXROW * sizeof *p);
2 голосов
/ 09 июля 2011

Это недопустимый код в C или C ++ .

Таким образом, он вообще ничего не "делает".

1 голос
/ 10 июля 2011

Я не скомпилировал следующий код, но я думаю, что он действителен с ++ - code:

    typedef int[MAXROW][MAXCOL] table;

    table *p = new table;

Этот код возможен только в том случае, если размеры массива известны во время компиляции.

Именно так большинство программистов на c ++ определяют p:

    using namespace std;
    vector<vector<int> > p;

Это позволяет более гибко программировать.

G, ребята, я давно не программировал K & R C!

1 голос
/ 09 июля 2011

Как вы можете узнать из этого вопроса , int (*p)[MAXCOL] - указатель на массив целых чисел MAXCOL.

Строка p = (int (*)[MAXCOL])malloc(MAXROW*sizeof(*p)); выделяет память для массива массивов MAXROWцелых чисел MAXCOL (то есть двумерного массива) и устанавливает p для указания на него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...