C-我不明白为什么这段代码没有输出我选择的值。 (指针)

时间:2018-12-09 19:39:08

标签: c function pointers

我应该接收并打印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);
}

3 个答案:

答案 0 :(得分:2)

您将指针设置为getVar stack 帧中数组的地址。

该函数返回时,将弹出堆栈框架,并且这些值超出范围。 (即可以/不应再访问它们)。

当您从printf调用main时,该调用将重用getVar先前使用的堆栈存储空间。同样,对于printFunc

因此,无论他们将其用作什么,它都会覆盖/破坏getVar创建的值

有两种方法可以解决此问题:

  1. getVarmalloc
  2. 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)

有两个问题:

  1. values[3]数组在getVar()函数中声明。后 函数结束,为int values[3]分配的空间 超出范围。这个问题的解决方案是分配 动态记忆:int* values = (int *)malloc(sizeof(int) * 3);
  2. 函数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);
}