首页 文章

如何为长度为30,000的单维数组动态分配内存?

提问于
浏览
0

我是一名学生,下周将参加C语言中的动态内存分配测试 . 我正在查看旧的测试问题,并且遇到了一个说:

编写一个C程序,动态创建一个长度为30,000的单维数组,并使用0到9之间的随机数初始化该数组 .

我对如何创建随机数并将它们放入数组有了深刻的理解,但我对我的malloc语句以及如何在其中放置除“sizeof”代码之外的数字感到困惑 . 例如,我有这个代码为float分配内存:

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

float* func();

int main(void)
{
    int i;
    float* x;
    float array[0];

    x=func();
    srand(time(NULL));
    i=random()%10;
    array[i];
 }
 float * func(void)
 {
     float z;
     float* ptr;
     ptr = malloc(30000 * sizeof(float));
     if(ptr == NULL)
     {
         puts("ALLOCATION FAILED.\n");
     }else{
         ptr = &z;
         return ptr;
     }
}

我的问题是如何为长度为30,000的单维数组动态分配内存?这种分配对于真实世界的软件开发工作有什么用?

2 回答

  • 4

    也许使用 calloc 更有意义 . 第一个参数是内存块中的元素数量(即大小为30 000的数组) . 第二个参数是一个块的大小(即数组中的一个元素) .

    所以你会这样称呼它:

    ptr = calloc(30000, sizeof(float));
    

    在您的情况下使用 calloc 存在一个瓶颈,因为将内存清零可能需要一些时间 . 您可以使用 malloc 执行相同的操作,而是执行此操作,使 ptr 未初始化 .

    ptr = malloc(30000 * sizeof(float));
    

    另请don't cast callocmalloc 的结果 .

    EDIT: 由于您更改了问题以解决您首先要求的问题,因此您的代码还存在其他一些问题 . 从格式化问题开始,您应该在include指令后添加空格 . 你的原型也是不正确的,因为它说 func 可以接受任何数量的参数,因为它指定了一个带有未定义参数的函数,因此你应该使用关键字 void 代替:

    #include <stdio.h>
    #include <stdlib.h>
    
    float* func(void);
    

    稍后在函数定义中,中间有星号,而原型中则是左边的星号 . 请保持一致 .

    你的 array 声明是多余的,因为你从不使用它(至少你不应该因为你为动态数组分配内存) .

    您在动态数组中设置数字的逻辑不起作用 . 您正尝试使用0到9之间的随机索引访问空的静态数组,这很可能会崩溃 . 我想你想要遍历动态数组的每个元素并分配0到9之间的随机整数,最后 random() 不是C中的函数;你想 rand()

    x=func(); // allocate memory for x
    srand(time(NULL)); // set a random seed for psuedo-random functions
    for(i=0;i<30000;i++) {
      x[i] = rand() % 10; // assign a random number between 0 and 9.
    }
    

    在您分配内存的函数中,您将使用一个整数数组覆盖指向动态数组的指针,这会在以后尝试访问它时使程序崩溃,因为它没有分配给它的内存 . 您还可以使用 perror 替换 puts 错误消息,以获取有关分配失败原因的更多详细信息 .

    ptr = malloc(30000 * sizeof(float));
     if(ptr == NULL) {
         perror("malloc failed");
         // handle error
     }else {
         return ptr;
     }
    
  • 2

    您的代码中有很多错误 . 我会尝试列出它们(每行后面的文字):

    float* func(void);
    

    使用prototype-declarators . C不是C!

    float array[0];
    

    这是没用的,因为你应该动态分配一个数组 .

    x=func();
    

    分配可能会失败 . Always 检查错误:if((x = func)== NULL){printf("Allocation failure.");出口(1); }

    i=random()%10;
    array[i];
    

    i 未初始化 . 并且您需要循环 x 指向的所有元素 . array 只是一个本地数组 . 这是未定义的行为 . 避免像地狱(或任何你最害怕的) .

    float * func(void)
    

    这里有趣,你有正确的类型 . 请注意,这与上面的声明不同!启用编译器警告并注意它们,编译器应该抱怨 .

    float z;
    

    做什么的?

    ptr = malloc(30000 * sizeof(float));
    

    这是一个好东西:这是正确的!你不应该在C中施放 void * .

    if(ptr == NULL)
    {
        puts("ALLOCATION FAILED.\n");
    

    好的,你在这里有消息 . 但你仍然回来,所以来电者也必须检查 . 除非你已经在这里 - 这是允许的,但不是好的风格 .

    ptr = &z;
    

    在这里,您覆盖指向已分配数组的指针并将其设置为 local 变量 . 你也不能 free 已分配的数组,因为你丢失了它的地址 . 只需删除此行以及 z 的定义;它们没用(而且这条线也错了) . This is the major fault

    return ptr;
    

    现在返回一个无效的内存地址 . Never 返回局部变量的地址 . 一旦离开定义的块(这里:函数),这就会过时 .

相关问题