【问题标题】:How can I create a dynamic array in a procedure in C?如何在 C 中的过程中创建动态数组?
【发布时间】:2016-05-11 21:26:12
【问题描述】:

我是这个很棒的网站的新手,我发现它在很多场合都非常有用,但现在我正在处理一个我似乎无法解决的问题。 我是初学者 C 学生,我正在研究动态内存分配。 我想创建一个动态数组,比如说,整数,在一个过程中为它分配内存,而不是在主函数中。

这行得通:

#include <stdio.h>
#include <stdlib.h>

int main()
{
        int *numbers; // pointer to create a dynamic array
        int *test; // pointer to test realloc function
        int c;
        size_t i = 0;
        unsigned int dim; // array's length

        // allocate memory for the 1st number 
        numbers = malloc(sizeof(*numbers));
        if (numbers == NULL) {
                fputs("Error while allocating memory!\n", stderr);
        } else {
                printf("Insert the 1 number: ");
                scanf("%d", &numbers[0]);
                ++i;

                /* allocate memory for the other numbers,
                 * until the user inputs EOF
                 */
                while (!feof(stdin)) {
                        test = realloc(numbers, (sizeof(*numbers) * (i + 1)));
                        if (test == NULL) {
                                fputs("Error while allocating memory!\n", stderr);
                        } else {
                                numbers = test;
                                printf("Insert the %u number: ", i + 1);
                                scanf("%d", &numbers[i]);
                                ++i;
                        }
                }
                dim = --i;

                // print the array, 5 numbers per line
                 for (i = 0; i < dim; ++i) {
                        if (i % 5 == 0) {
                                puts("");
                        }
                        printf("%d ", numbers[i]);
                }
                puts("");
        }

        getchar();
        return 0;
}

但我想这样做(这是行不通的):

#include <stdio.h>
#include <stdlib.h>

void get_numbers(int **numbers, unsigned int *dim);

int main()
{
        int *numbers; // pointer to create a dynamic array
        size_t i = 0;
        unsigned int dim; // array's length

        get_numbers(&numbers, &dim);

        // print the array, 5 numbers per line
         for (i = 0; i < dim; ++i) {
                if (i % 5 == 0) {
                        puts("");
                }
                printf("%d ", numbers[i]);
        }
        puts("");

        getchar();
        return 0;
}

void get_numbers(int **numbers, unsigned int *dim)
{
        int *test; // pointer to test realloc function
        int c;
        size_t i = 0;

        // allocate memory for the 1st number 
        *numbers = malloc(sizeof(*numbers));
        if (*numbers == NULL) {
                fputs("Error while allocating memory!\n", stderr);
        } else {
                printf("Insert the 1 number: ");
                scanf("%d", &numbers[0]); // Maybe the error is here
                ++i;

                /* allocate memory for the other numbers,
                 * until the user inputs EOF
                 */
                while (!feof(stdin)) {
                        test = realloc(*numbers, (sizeof(*numbers) * (i + 1)));
                        if (test == NULL) {
                                fputs("Error while allocating memory!\n", stderr);
                        } else {
                                *numbers = test;
                                printf("Insert the %u number: ", i + 1);
                                scanf("%d", &numbers[i]);
                                ++i;
                        }
                }
                *dim = --i;
        }
}       

我需要使用指向 int 的指针,对吗? 我知道我犯了一些错误,但我不知道如何解决它们。 提前感谢您的回复! 再见, 法比奥·纳德利

【问题讨论】:

  • scanf("%d", &amp;numbers[i]); --> scanf("%d", &amp;(*numbers)[i]); or scanf("%d", *numbers + i);, sizeof(*numbers) --> sizeof(**numbers)
  • @BLUEPIXY 非常感谢!!它有效!!!!
  • @BLUEPIXY 如果我有一个结构数组怎么办?例如结构数据 *p; scanf 应该是 (*p)[i].field 吗?
  • p[i].field .... struct data { int field; } x[10], *p = x;.. scanf("%d", &amp;p[i].field);
  • @BLUEPIXI p[i].field 不起作用,而 (*p)[i].field 起作用。无论如何,在我发布的代码中,它们同时适用于 sizeof(*numbers) 和 sizeof(**numbers)。为什么?

标签: c pointers dynamic malloc procedure


【解决方案1】:

在第一个代码块中,numbers 的类型为 int*
在第二个代码块中,numbers 的类型为 int**

由于该更改,您尚未修复所有需要修复的地方。

我的建议:

  1. 将输入参数更改为numbersPtr
  2. 创建一个局部变量int* numbers
  3. 从函数返回之前,将*numbersPtr 设置为number

void get_numbers(int **numbersPtr, unsigned int *dim)
{
   int* numbers;

   ...

   *numbersPtr = numbers;
}

最好将get_numbers改为返回numbers

int* get_numbers(unsigned int *dim)
{
   int* numbers;

   ...

   return numbers;
}

并将其用法更改为:

numbers = get_numbers(&dim);

【讨论】:

  • 感谢您的回复!所以你的意思是在 scanf 中使用数字?
  • @FabioNardelli,使用numbers,就像您在第一段代码中使用的一样。
  • 更好的是:该数组是 get_numbers 函数的输出,因此请将其作为返回值而不是使用参数:int *get_numbers(unsigned *dim)... 以 return numbers; 结尾
  • @ChrisDodd,更好的建议。
  • @ChrisDodd 谢谢,但我想我不得不使用 void 函数(这是大学的家庭作业)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 2013-12-16
  • 2016-02-22
相关资源
最近更新 更多