【问题标题】:dynamic define and allocate pointers动态定义和分配指针
【发布时间】:2018-06-29 15:46:46
【问题描述】:

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

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

但是当我编译它时,出现了很多错误。有人可以帮忙解决吗?

【问题讨论】:

  • 如果您没有在问题中包含错误,那么告诉我们有错误是没有意义的!但很明显,问题在于您在第一个 for 循环中声明变量并尝试在第二个循环中使用它们。
  • 你也错误地使用了malloc。您需要以字节为单位指定要分配的大小,因此要分配 100 个浮点数 malloc(sizeof(float)*100)
  • @Acorn no - 是 10 float *,但 OP 将 * 放在了错误的位置。
  • 使用宏来降低代码的可读性是没有意义的。这是XY Problem 吗?你实际上想要达到什么目的?
  • 为什么要使用宏来创建编号变量而不是只使用数组?

标签: c pointers macros


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果ww 应该代表 10 个数组,每个数组有 100 个浮点数(编译时已知数字),那么只需使用多维数组:

    float ww[10][100];
    

    并在使用时进行相应的索引(例如:ww[7][93] = 6;)。

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

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

    并在使用时进行相应的索引(例如:(*(ww[7]))[93] = 6;ww[7]-&gt;[93] = 6;)。

    记得在完成后释放每个。

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

    警告:记住malloc 不会初始化新分配的内存——这取决于你!强烈建议使用calloc 将内存清零,使其处于已知状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多