我应该接收并打印3个值,但是每个部分都使用指针和函数。 arrPointer是指向数组的指针,它转到getVar函数,从用户那里接收3个输入,将它们放入数组中,并将数组的地址返回给main。然后使用该地址打印3个变量。或者至少应该如此。我在做什么错了?
#include <stdio.h>
int getVar()
{
int *arrPointer;
int values[3];
printf("Enter 3 values:\n");
scanf("%d", &values[0]);
scanf("%d", &values[1]);
scanf("%d", &values[2]);
arrPointer = values;
return(arrPointer);
}
void printFunc(int *arrPointer)
{
int i;
for(i = 0; i<3; i++)
{
printf("%d", *arrPointer);
arrPointer++;
}
printf("\n");
}
int main()
{
int *arrPointer;
arrPointer = getVar();
printf("The numbers entered in order are: ");
printFunc(arrPointer);
}
答案 0 :(得分:2)
您将指针设置为getVar
的 stack 帧中数组的地址。
该函数返回时,将弹出堆栈框架,并且这些值超出范围。 (即可以/不应再访问它们)。
当您从printf
调用main
时,该调用将重用getVar
先前使用的堆栈存储空间。同样,对于printFunc
。
因此,无论他们将其用作什么,它都会覆盖/破坏getVar
创建的值
有两种方法可以解决此问题:
getVar
做malloc
main
将数组的地址[在main
的堆栈帧中]传递给getVar
有关指针和数组的更详细的说明,请在这里查看我的答案:Issue implementing dynamic array of structures
以下是带有malloc
的版本:
#include <stdio.h>
#include <stdlib.h>
int *
getVar()
{
int *values = malloc(sizeof(int) * 3);
printf("Enter 3 values:\n");
scanf("%d", &values[0]);
scanf("%d", &values[1]);
scanf("%d", &values[2]);
return values;
}
void
printFunc(int *arrPointer)
{
int i;
for (i = 0; i < 3; i++) {
printf("%d", *arrPointer);
arrPointer++;
}
printf("\n");
}
int
main()
{
int *arrPointer;
arrPointer = getVar();
printf("The numbers entered in order are: ");
printFunc(arrPointer);
free(arrPointer);
return 0;
}
以下是使用main
中的堆栈变量的版本:
#include <stdio.h>
void
getVar(int *values)
{
printf("Enter 3 values:\n");
scanf("%d", &values[0]);
scanf("%d", &values[1]);
scanf("%d", &values[2]);
}
void
printFunc(int *arrPointer)
{
int i;
for (i = 0; i < 3; i++) {
printf("%d", *arrPointer);
arrPointer++;
}
printf("\n");
}
int
main()
{
int arr[3];
getVar(arr);
printf("The numbers entered in order are: ");
printFunc(arr);
}
更新:
是否可以从函数返回数组或多个变量?
是的,在某种程度上,呼叫者必须传递一个额外值的地方。
在上面的第二个示例中,另一种查看方式是调用方(即main
)正在从{{1} },并为数组中的这些值提供空间。
另一种方法是让调用者传递多个指针值,以显示返回值的位置:
getVar
但是,如果需要两个以上的值,则传递指针参数可能会变得乏味。
因此,在这种情况下,我们可以传递#include <stdio.h>
void
getVar(int *val,float *fval)
{
printf("Enter 2 values:\n");
scanf("%d", val);
scanf("%f", fval);
}
int
main()
{
int val;
float fval;
getVar(&val,&fval);
}
的地址,该地址可以具有我们希望的返回值:
struct
请注意,我们也可以将#include <stdio.h>
struct values {
int val;
float fval;
int count;
int rval;
};
void
getVar(struct values *ret)
{
printf("Enter 3 values:\n");
scanf("%d", &ret->val);
scanf("%f", &ret->fval);
scanf("%d", &ret->count);
ret->rval = rand() % ret->count;
}
int
main()
{
struct values val;
getVar(&val);
}
方法与malloc
结合使用。也就是说,struct
执行getVar
,然后返回此指针(在填充结构之后)。
答案 1 :(得分:1)
有两个问题:
values[3]
数组在getVar()
函数中声明。后
函数结束,为int values[3]
分配的空间
超出范围。这个问题的解决方案是分配
动态记忆:int* values = (int *)malloc(sizeof(int) * 3);
getVar()
的返回类型应为指针类型。将int getVar()
更改为int* getVar()
答案 2 :(得分:0)
要将值保存到数组,您将需要像以前一样使用变量(int)将数组的每个位置设置为数组。但是您不能执行arrPointer =值。 同样,您需要将指针传递给函数,而不是再次声明它们。 希望这对您有所帮助
#include <stdio.h>
int getVar(int *values[])
{
printf("Enter 3 values:\n");
scanf("%d", &values[0]);
scanf("%d", &values[1]);
scanf("%d", &values[2]);
return values;
}
void printFunc(int *values[])
{
int i;
for(i = 0; i<3; i++)
{
printf("%d", values[i]);
}
printf("\n");
}
int main()
{
int *arrPointer;
int *values[3];
getVar(values);
printf("The numbers entered in order are: ");
printFunc(values);
}