动态定义和分配指针

时间:2018-06-29 15:46:47

标签: c pointers macros

我要动态定义和分配指针:

#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 :(得分:3)

您无法做您想做的事情。预处理器宏在编译时进行扩展,它们不能依赖于运行时变量值。所以

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 *));
}

答案 1 :(得分:0)

如果假设ww代表10个数组,每个数组包含100个浮点数(在编译时为已知数字),则只需使用多维数组:

float ww[10][100];

,并在使用时相应地建立索引(例如:ww[7][93] = 6;)。

如果'ww' 必须 如您所说包含动态分配的指针,则使用(其中每个元素都是指向100个浮点数的数组的指针

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而不是将内存清零,使其处于已知状态。