- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试加载一个大小为 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/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
指针, C语言的精髓 莫队先咕几天, 容我先讲完树剖 (因为后面树上的东西好多都要用树剖求 LCA). 什么是指针 保存变量地址的变量叫做指针. 这是大概的定义, 但是Defad认为
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我是一名优秀的程序员,十分优秀!