gpt4 book ai didi

c - 静态或指针当 "Returning"数组

转载 作者:行者123 更新时间:2023-11-30 16:31:39 25 4
gpt4 key购买 nike

我正在尝试加载一个大小为 n(用户输入)的数组,其中包含随机值。我读到你不能在 C 中返回数组,你必须使用指针(这很令人困惑)。但是,我读到,如果您将该数组存储到返回函数中的局部变量中,则指针将不起作用,并且可以使用静态数组(可以在函数中返回吗?)。另外,我读到您应该在使用数组打开空间备份后调用 free 吗?我一定是用错了它,因为它崩溃了。所以我暂时把它注释掉了。一些澄清会很好。

这是我到目前为止所拥有的。打印时,它只是打印我认为只是垃圾的内容。

int* prefixAverages1(int);

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

int main() {

int choice;
int input;

printf("What is the size of the array?:");
scanf("%d", &input);
printf("Do you want to run prefixAverages 1 or 2?");
scanf("%d", &choice);

switch(choice) {
case 1:
printf("Beginning prefixAverages1\n");
int *a = prefixAverages1(input);
for (int i=0; i < input; i++) {
printf("%d", &i);
printf("%d \n", a[i]);
}
//free(a);
break;
}
}

int* prefixAverages1(int input) {
int x[input];
int *a = (int*)malloc(input);
srand(time(NULL));

for(int i = 0; i < input; i++) {
int s = 0;
for(int j = 0; j < i; j++) {
int r = rand() % 100;
x[j] = r;
s = s + x[j];
}
a[i] = s / (i+1);
printf("%d \n", a[i]);
}
return a;
}

我知道我的语法可能很奇怪。我已经很多年没有接触过 C 了,所以如果我的错误是语法错误,请告诉我。

编辑:值按照函数中的预期打印。为了清晰起见,在代码中添加了 print 语句

最佳答案

I'm attempting to load an array of size n (user input), with random values. I've read that you can not return an array in C, you must use a pointer (Which is quite confusing).

是的,指针和数组之间的关系以及数组本身无法执行的令人惊讶的广泛操作是常见的混淆点。在某种程度上,这是一种迂腐的区分。几乎所有 C 语言允许您对数组执行的操作都通过指针来完成,但它会自动将数组类型的值转换为适当的指针,因此这些细节在很大程度上被隐藏了。

但在某些地方它会突出。例如,没有有效的语法允许您尝试声明返回数组的函数。

在其他地方,它具有积极的误导性。例如,您可以声明一个函数,该函数似乎接受数组作为参数,但标准明确指定该参数实际上是一个相应的指针(这就是当您调用这样的函数时自然会出现的情况)无论如何都能发挥作用)。具体来说:

int foo(int x[3]);

100% 相当于

int foo(int *x);

However, I've read that if you are storing that array to a local variable in the returning function, a pointer will not work

这并不是特别关于数组,而是关于一般的自动变量。当它们超出范围时(在声明它们的最内层 block 的末尾),这些对象在逻辑上就不再存在,因此一旦函数返回,指向或指向此类对象的指针就不再有效。获取此类指针值的一种方法是让函数返回它。这本身是可以的,但是您不能安全地取消引用这样的指针值。

and a static array can be used (can that be returned in a function?).

任何类型的静态变量的生命周期都是程序的整个执行过程。因此,从函数返回指向静态变量的指针是安全且有意义的。但是,尽管可以从函数中返回指向静态数组的指针,但您仍然无法返回这样的数组本身。

Also, I've read that you are supposed to call free after using the array is open the space back up?

您应该释放使用内存分配函数之一(malloc() 等)分配的内存,而不是其他函数。但是,当您在函数内部分配内存时,您可以通过返回指向该内存的指针等方式让调用者负责释放该内存。

事实上,您在示例代码中演示的大部分内容在这些方面都很好。然而,您确实犯了一个破坏您的程序的关键错误。这里:

    int *a = (int*)malloc(input);

您分配input 字节并将指向它们的指针存储在a中,但这不足以存储input 类型为 int 的对象。 int 的大小因实现而异,但标准允许的最小大小是两个字节,最常见的大小是四个字节。要为 int 类型的 input 对象分配空间,基本习惯用法是

int *a = malloc(input * sizeof(int));

不过就我个人而言,我更喜欢

int *a = malloc(input * sizeof(*a));

因为这样无论指针的引用类型是什么类型,即使我稍后更改它,我都会得到正确的大小。

您将分配的空间视为比实际空间大的事实很可能解释了程序的大部分错误行为,包括当您尝试释放分配的内存时发生崩溃。

关于c - 静态或指针当 "Returning"数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50475554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com