在c中取消引用指针时的不同值

在c中取消引用指针时的不同值,c,pointers,C,Pointers,说到指针,我是一个c程序员新手。 我试图计算总质数,直到一个特定的用户输入。 首先,我在主函数中获取输入并将其传递给printPrimes函数。在新函数中,我计算素数并将它们存储在数组中,最后将指针传递给主函数。 我的问题是,为什么我得到两个循环的不同输出,一个在main函数中,另一个在printPrimes中。 我的代码是: #include <stdio.h> int* printPrimes(int x) { int i; int j; int y[

说到指针,我是一个c程序员新手。 我试图计算总质数,直到一个特定的用户输入。 首先,我在主函数中获取输入并将其传递给
printPrimes
函数。在新函数中,我计算素数并将它们存储在数组中,最后将指针传递给主函数。 我的问题是,为什么我得到两个循环的不同输出,一个在
main
函数中,另一个在
printPrimes
中。 我的代码是:

#include <stdio.h>

int* printPrimes(int x)
{

    int i;
    int j;
    int y[30];
    int dummy=0;
    int count=0; 
    int *p = malloc(30*sizeof(*p));

    for(i; i<=x; i++)
    {
        for(j=2; j<i ;j++)
        {
            dummy=(i % j);
            if(dummy == 0)
            {
                break;
            }
        } 

        if (dummy != 0 || i==2)
        { 
            y[count]=i;
            count++;
        }

    }

    p=y;

    for(i=0;i<=30;i++)
    {
    printf("%d , ",*(p+i));   //LOOP1
    }
    printf("\n");

    return p;
}

void main()
{
    int x;
    int *q;
    int j;
    int i;

    printf("enter the value of x , the number upto which you want primes");
    scanf("%d",&x);
    q=printPrimes(x);

    for(i=0;i<=30;i++)
    {
    printf("%d , ",*(q+i));   //LOOP2
    }
}
要获得相同的输出,我可以做些什么? 问候。

那是因为

int y[30];
在堆栈上分配作用域本地内存。一旦作用域结束(在本例中为函数return),对该内存的访问将变得未定义。堆栈被
printf
重用并覆盖

试一试

通常,如果希望对数组使用堆栈,请在调用的函数中分配堆栈,并将其传递给填充堆栈的函数:

int* printPrimes(int x, int * y);
main
中:

int y[30];
printPrimes(x, y);
那是因为

int y[30];
在堆栈上分配作用域本地内存。一旦作用域结束(在本例中为函数return),对该内存的访问将变得未定义。堆栈被
printf
重用并覆盖

试一试

通常,如果希望对数组使用堆栈,请在调用的函数中分配堆栈,并将其传递给填充堆栈的函数:

int* printPrimes(int x, int * y);
main
中:

int y[30];
printPrimes(x, y);

您的问题是试图通过以下方式复制阵列:

p=y;
实际上,这只会用
y
的(堆栈)地址覆盖新分配内存的地址。它不会复制数组元素,这可能是您想要的

你需要:

memcpy(p, y, 30*sizeof *p);

或者干脆停止使用
y
,然后到处使用
p
。返回
malloc()
ed指针是完全正常和安全的。请记住,当不再需要内存时,调用
free()
是调用方的责任。

您的问题是试图通过以下方式复制数组:

p=y;
实际上,这只会用
y
的(堆栈)地址覆盖新分配内存的地址。它不会复制数组元素,这可能是您想要的

你需要:

memcpy(p, y, 30*sizeof *p);

或者干脆停止使用
y
,然后到处使用
p
。返回
malloc()
ed指针是完全正常和安全的。只要记住,当不再需要内存时,调用
free()
就成了调用方的责任。

看起来这个项目是为了学习指针的使用。您还应该了解的一个重要细节是关于内存泄漏。。。虽然误用的指针通常(太)容易发现,但了解内存泄漏并知道如何修复它们有时仍然很微妙。1)返回局部值。2) 总是高达30。3)
i当p被分配内存时,不需要为y分离数组。看起来这个项目是为了学习指针的使用。您还应该了解的一个重要细节是关于内存泄漏。。。虽然误用的指针通常(太)容易发现,但了解内存泄漏并知道如何修复它们有时仍然很微妙。1)返回局部值。2) 总是高达30。3) 
i当p已分配内存时,不需要为y分离数组。