我是一名学生,下周将参加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 回答
也许使用
calloc
更有意义 . 第一个参数是内存块中的元素数量(即大小为30 000的数组) . 第二个参数是一个块的大小(即数组中的一个元素) .所以你会这样称呼它:
在您的情况下使用
calloc
存在一个瓶颈,因为将内存清零可能需要一些时间 . 您可以使用malloc
执行相同的操作,而是执行此操作,使ptr
未初始化 .另请don't cast
calloc
或malloc
的结果 .EDIT: 由于您更改了问题以解决您首先要求的问题,因此您的代码还存在其他一些问题 . 从格式化问题开始,您应该在include指令后添加空格 . 你的原型也是不正确的,因为它说
func
可以接受任何数量的参数,因为它指定了一个带有未定义参数的函数,因此你应该使用关键字void
代替:稍后在函数定义中,中间有星号,而原型中则是左边的星号 . 请保持一致 .
你的
array
声明是多余的,因为你从不使用它(至少你不应该因为你为动态数组分配内存) .您在动态数组中设置数字的逻辑不起作用 . 您正尝试使用0到9之间的随机索引访问空的静态数组,这很可能会崩溃 . 我想你想要遍历动态数组的每个元素并分配0到9之间的随机整数,最后
random()
不是C中的函数;你想rand()
:在您分配内存的函数中,您将使用一个整数数组覆盖指向动态数组的指针,这会在以后尝试访问它时使程序崩溃,因为它没有分配给它的内存 . 您还可以使用
perror
替换puts
错误消息,以获取有关分配失败原因的更多详细信息 .您的代码中有很多错误 . 我会尝试列出它们(每行后面的文字):
使用prototype-declarators . C不是C!
这是没用的,因为你应该动态分配一个数组 .
分配可能会失败 . Always 检查错误:if((x = func)== NULL){printf("Allocation failure.");出口(1); }
i
未初始化 . 并且您需要循环x
指向的所有元素 .array
只是一个本地数组 . 这是未定义的行为 . 避免像地狱(或任何你最害怕的) .这里有趣,你有正确的类型 . 请注意,这与上面的声明不同!启用编译器警告并注意它们,编译器应该抱怨 .
做什么的?
这是一个好东西:这是正确的!你不应该在C中施放
void *
.好的,你在这里有消息 . 但你仍然回来,所以来电者也必须检查 . 除非你已经在这里 - 这是允许的,但不是好的风格 .
在这里,您覆盖指向已分配数组的指针并将其设置为 local 变量 . 你也不能
free
已分配的数组,因为你丢失了它的地址 . 只需删除此行以及z
的定义;它们没用(而且这条线也错了) . This is the major fault现在返回一个无效的内存地址 . Never 返回局部变量的地址 . 一旦离开定义的块(这里:函数),这就会过时 .