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

标签 c pointers

在指针方面,我是一名 C 语言新手。 我正在尝试计算特定用户输入之前的总质数。 首先,我在 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 ,

我该怎么做才能获得相同的输出? 问候。

最佳答案

那是因为

int y[30];

在堆栈上分配作用域本地内存。一旦范围结束(在本例中为函数返回),对该内存的访问将变为未定义。堆栈被 printf 重用并被覆盖。

尝试

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

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

int* printPrimes(int x, int * y);

main 中:

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

关于c - 在 c 中取消引用指针的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22068414/

相关文章:

c - 使用 gcc 的中间 GIMPLE 格式

c - strtok 导致段错误,但在单步执行代码时则不会

c - 为什么这个程序在我的电脑上运行正常,但在另一台电脑上却导致溢出?

c - 在 C 中使用指针连接字符串!

c - 如何转换一个数字的数字?

c - 服务器套接字 errno 57 - 套接字未连接

c - 函数调用后变量值发生变化,未被使用

java - 从 Java 的角度看 C 指针和数组的教程

java - 什么是Java中的引用值,为什么会发生变化?

c - 为什么153的阶乘在下面的程序中失败了