【问题标题】:Memory allocation of multiple arrays of random sizes多个随机大小数组的内存分配
【发布时间】:2020-09-01 20:29:43
【问题描述】:

我被分配了编写一个程序的任务,该程序动态分配 n 随机大小的数组 t,用随机值填充它们,找到最小和最大元素,然后打印出它们的差异模块.

用户输入的n的值必须在(5, 20]范围内,t应该在[10, 1000]范围内生成并且用于填充这些数组的值的范围应该为 [-10, 0]。

这是我的尝试:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
    int n,i,j,t,a[t],z,min=10000000,max=0;
    do
    {
        scanf("%d",&n);
    }
    while(n<=5 || n>20);
    for(i=0;i<n;i++)
    {
    t=(10)+rand()%(10-1000+1);
    a[t]=(int*)malloc(t*sizeof(int));  // <-- This generates an error
    for(j=0;j<t;j++)
    {
        a[t]=(-10)+rand()%(-10+1);
        if(a[t]<min) min=a[t];
        if(a[t]>max) max=a[t];
    }
    
    }
    printf("%d",z=abs(min-max));
    return 0;
    
}

编译器只显示这个错误,但我不确定其余代码是否良好。

15 6  C:\Users\x\asfag.cpp  [Error] invalid conversion from 'int*' to 'int' [-fpermissive]

我做错了什么?

【问题讨论】:

  • a[t] 应该是*a,而a[t]=(int*)malloc(t*sizeof(int)); 应该是a=malloc(t*sizeof(int)); 别忘了free 内存
  • 已修复错误但我没有得到任何输出
  • t 的值是好的,它的 % -989 不是 -9989
  • 请尝试改掉在一行中声明一大堆变量的习惯,并努力给出这些有意义的名称。提示:您通常可以在循环本身内声明循环变量,从而减少混乱并更容易验证循环是否正确:for (int i = 0; ...) 比在您需要去寻找它的其他地方声明 int i 要好得多。跨度>

标签: arrays c pointers memory random


【解决方案1】:

您的代码中存在一些问题,但让我们关注明显的错误而不是逻辑,这是您应该自己解决的问题。

a[t]=(int*)malloc(t*sizeof(int)); 行在几个级别上都不好。

假设t-500,您为存储在数组索引a[-500] 中的int 分配一个大小可能为-2000 字节的内存块,具体取决于int 的大小你的系统。

问题是数组没有负索引,内存块不能有负值,它们必须分配给不是ints 的指针,这将存储在你的数组中的索引-500 (??) ,如果它存在我猜。更重要的是,您将内存重新分配给循环内的同一个指针,这是您无法做到的,这就是 realloc 的用途。此外,您一遍又一遍地重新分配相同的大小,这没什么意义。

使用正确的分配将分配移动到循环之前,它看起来像:

int *a;
//...
t = rand() % (1000 - 10); //assign a positive value to t
a = malloc(t * sizeof *a);
//...

前提是t不是负数。

malloc也不是一个好习惯。

还有这个作业:

 a[t] = (-10) + rand() % (-10 + 1);

您正在为整个循环中的同一数组索引分配一个随机值,顺便说一下,它表示数组边界结束后的一个值(假设分配已更正),您可能需要a[i]

这是一个好的开始,您的代码将编译并运行,现在您需要解决逻辑问题,这也非常需要注意。如果你要学习编码,你应该自己做。

我还建议,作为发展技能的好方法,阅读good C book

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2019-03-19
    • 2023-04-10
    • 2018-01-22
    • 1970-01-01
    • 2013-05-29
    • 2019-07-03
    相关资源
    最近更新 更多