динамически определять и распределять указатели - PullRequest
0 голосов
/ 29 июня 2018

Я хочу динамически определять и размещать указатели:

#include<stdio.h>
#define def_var(type,name,i) type name##i
#define var(name,i) name##i
void main(){
  int i;
  for (i=0;i<10;i++){
    def_var(float,*ww,i)=NULL;
  }
  for (i=0;i<10;i++){
    var(ww,i)=(float *)malloc(100);
  }
}

Но когда я его компилирую, появляется много ошибок. Кто-нибудь может помочь исправить это?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Если ww должен представлять 10 массивов по 100 чисел с плавающей точкой каждый (известные числа во время компиляции), то просто используйте многомерный массив:

float ww[10][100];

и индекс соответственно при использовании (например: ww[7][93] = 6;).

Если 'ww' должен содержать, как вы говорите, динамически размещенные указатели, тогда используйте (где каждый элемент является указателем на массив из 100 float )

float (*ww[10]) [100];
for (i=0;i<10;i++){
    ww[i]=malloc(sizeof(float)*100);
  }

и индекс соответственно при использовании (например: (*(ww[7]))[93] = 6; или ww[7]->[93] = 6;).

Не забудьте освободить каждого, когда закончите.

for (i=0;i<10;i++){
    free(ww[i]);
  }

Внимание : Помните, malloc не будет инициализировать вновь выделенную память - это ваше дело! Настоятельно рекомендуется использовать calloc вместо того, чтобы обнулить память, поэтому она находится в известном состоянии.

0 голосов
/ 29 июня 2018

Ты не можешь делать то, что пытаешься сделать. Макросы препроцессора раскрываются во время компиляции, они не могут зависеть от значений переменных во время выполнения. Итак

def_var(float,*ww,i)=NULL;

расширен до

float *wwi = NULL;

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

Кроме того, объявления переменных имеют область видимости блока, поэтому любые переменные, объявленные в цикле for, исчезают по завершении цикла.

Просто объявите массив указателей.

float *ww[10];
for (int i = 0; i < 10; i++) {
    ww[i] = malloc(100 * sizeof(float *));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...