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

时间:2014-02-27 12:22:52

标签: c pointers

当涉及到指针时,我是一名新手程序员。 我试图计算直到特定用户输入的总素数。 首先,我在main函数中输入并将其传递给printPrimes函数。在新函数中,我计算素数并将它们存储在一个数组中,最后将指针传递给main函数。 我的问题是,为什么我在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
    }
}

输出结果为:

enter the value of x , the number upto which you want primes23
2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 110 , 0 , 0 , -298634272 , 32767 , 4195536 , 0 , -298634048 , 32767 , 2108875317 , 32711 , 0 , 0 , 1024 , 0 , -298634280 , 32767 , -298634280 , 32767 , 4196485 , 0 , -298634448 ,
2 , 606348324 , 3 , 0 , 11 , 13 , 17 , 19 , 23 , 110 , 0 , 0 , -298634272 , 32767 , 4195536 , 0 , -298634048 , 32767 , 2108875317 , 32711 , 0 , 0 , 1024 , 0 , -298634280 , 32767 , -298634280 , 32767 , 4196485 , 0 , -298634448 ,

如何获得相同的输出? 问候。

2 个答案:

答案 0 :(得分:3)

那是因为

int y[30];

在堆栈上分配范围本地内存。一旦范围结束(在这种情况下函数返回),对该存储器的访问将变为未定义。堆栈被printf重用并被覆盖。

尝试

int *y = calloc(30, sizeof(int));

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

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

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

答案 1 :(得分:1)

您的问题是尝试进行数组复制:

p=y;

这实际上只覆盖了新分配的内存的地址,其中(堆栈)地址为y。它不会复制数组元素,这可能就是您的意图。

你需要:

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

或者完全停止使用y,并在任何地方使用p。返回malloc() ed指针是完全正常和安全的。请记住,当不再需要内存时,调用free()成为调用者的责任。