如何定义、分配以及初始化用户定义长度的数组的值



我是MIPS32的新手,正在进行一项任务,该任务要求我首先向用户询问他们想要定义的数组的长度,然后询问他们各自的值是多少。我写了一个粗略的C代码,它也做同样的事情,如下

int main()
{
int N;
scanf("%dn", &N);      // will be the first line, will tell us the number of inputs we will get
int i=0, A[N];           // (1)
// Loop to enter the values to be sorted into an array we have made A[]. the values are entered as a1, a2.... and so on.
while(i != N)
{
scanf("%dn", &A[i]);
i++;
}
}

我主要在写上面的代码时遇到了问题,主要是MIPS32中的第(1(行。我知道在数据部分中定义数组的大小本身不是一个选项,但我不确定如何动态定义大小为N的数组,然后将值存储到数组中。任何关于我能做什么的帮助或建议都会非常有帮助。

数组可以存储在全局内存、堆栈内存或堆内存中。

  • 全局内存

    全局内存在程序构建时基本上是固定大小的——您可以在.data中放置一个标签,并使用.space或其他数据指令保留一些恒定的空间。

    这里的一种方法是有一个最大值(比如100(,所以为这么多保留空间,并编程一个极限测试,以确保代码不会试图使用超过预定义的最大值。

    作为例外,最后一个全局数据项可用于存储大小相对未知的数组。这恰好适用于QtSpim和MARS,因为全局数据后面有相当大的空间可供使用。这种方法不是很专业,因为代码无法真正知道在多大的规模下这将不再有效,但对于示例玩具程序和一次性任务来说,这是一种有效的方法。在全局数据的末尾加一个标签,不保留任何空格或只保留一个空格。

    整数元素数组有对齐要求,因此当将全局数据放在字符串数据之后时,通常需要使用对齐(作为单独的指令或通过保留一个字,例如.word,它将自动注入对齐(。

  • 堆内存

    堆内存可以使用MARS/QtSpim系统调用#9进行分配。如果分配失败,则说明大小太大,但如果分配成功,则可以获得所需的所有空间。系统调用#9返回一个指向$v0中新分配的内存的指针,您通常希望将该值存储在某个位置(寄存器或全局(以供以后使用。

  • 堆栈存储器

    堆栈向下增长:可以通过递减堆栈指针来分配堆栈内存。堆栈指针在递减之后指向新分配的内存。可以按固定量或可变量递减堆栈指针。在您的情况下,您将使用可变金额。通常要求堆栈指针保持对齐,因此在计算递减量时,我们会四舍五入。如果需要多个实体,可以多次递减堆栈指针,或者将大小相加并递减一次,这将是更常见的方法。

    在函数返回到调用方之前(或作为调用方(,堆栈指针必须返回到函数进入时的值。这将释放任何已分配的堆栈内存,并向调用方返回与调用函数时相同的堆栈环境。理所当然地,将释放的内存返回给调用者将是一个逻辑错误,因此这种方法不能在需要将数组返回给调用者的函数中使用。

    任何使用系统调用#10终止程序的函数都不必满足这一要求,因为程序在系统调用后立即终止。这种方法通常用于退出main-MARS需要它;呼叫";main,而QtSpim在默认情况下插入一个小的启动存根;呼叫";main

最新更新