【问题标题】:Generate int of numbers between 1 and n with dynamic n使用动态 n 生成 1 到 n 之间的整数
【发布时间】:2012-12-28 03:26:23
【问题描述】:

我正在努力使用一种算法将 1 和动态变量 n 之间的数字打印到 int 中。

int n = // dynamic value
int i = 0;
int output[n];

for(i = 0; i < n; i++) {
    output[i] = i;
}

但是,由于 n 是动态的,代码不会编译。

任何帮助将不胜感激 - 在此先感谢。

【问题讨论】:

  • 无法编译的代码是int output[n],是吗?您需要使用 malloc 动态分配内存。
  • 您一定使用的是古老的编译器。这在 C99 中完全有效。

标签: c


【解决方案1】:

您需要使用malloc 分配一个缓冲区或动态大小的数组:

int n = // whatever
int i = 0;
int* output = NULL;

// Allocate the buffer
output = malloc(n * sizeof(int));
if (!output) {
    fprintf(stderr, "Failed to allocate.\n");
    exit(1);
}

// Do the work with the array
for(i = 0; i < n; i++) {
    output[i] = i;
}

// Finished with the array
free(output);

output是一个指向你分配的缓冲区开头的指针,你可以把它当作一个nints的数组。

当您完成数组后,您需要使用free 取消分配内存。

【讨论】:

  • 或者您可以使用 -std=c99 进行编译
  • @benjarobin 我听说过,但从未使用过此功能。是堆栈分配还是堆分配?
  • stack : 如果它是堆的,你如何释放内存?此功能非常有用,但可能非常危险
  • c99 将从堆栈中分配。当然,你需要先在'n'中有一个有效的值,否则它不起作用。
  • 哦,你不应该从 malloc 转换输出。
【解决方案2】:

这应该可行:

int n = // whatever
int i = 0;
int* output = (int*)malloc(sizeof(int)*n);

for(i = 0; i < n; i++) {
    output[i] = i;
}

当您不再需要它时,不要忘记free(output);

编辑:把它做成 C.

【讨论】:

  • 从问题中不清楚。在您的评论后看到标签。 :)
【解决方案3】:

如果“n”在运行时发生变化,那么您可以像 cmets 中建议的那样使用 malloc。然后检查您是否需要更多空间,然后在需要时自动重新分配更多空间

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2014-03-14
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2022-05-04
    相关资源
    最近更新 更多