为什么两次printf打印相同的变量,结果却是不一样


#define _CRT_SECURE_NO_WARNINGS
#include 

int* sentence(int arr[3][3], int k);

int main()
{
    int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
    printf("请输入要查找的数字\n");
    int k = 0;
    scanf("%d", &k);
    int* ret = sentence(arr,k);
    if (ret == NULL)
    {
        printf("没找到");
    }
    else
    {
        printf("找到了: x= %d  ,  y= %d\n", *ret , *(ret + 1));
        printf("也就是: 第 %d 行,第 %d 列\n", *ret, *(ret + 1));
    }
    
    return 0;
}

int* sentence(int arr[3][3], int k)
{
    int x = 0;
    int y = 2;
    
    while (x <= 2 && y>=0)
    {
        if (k > arr[x][y])
        {
            x++;
        }
        else if (k < arr[x][y])
        {
            y--;
        }
        else
        {
            int memory[2] = { x,y };
            return memory;
            break;
        }
    }
    return NULL;
    
}

img

为什么两次打印相同的变量,结果却是不一样

看了内存,地址也没变
就是两个第一个printf打印以后,打印的变量就变了。

指针只存储地址,改地址没有声明被占用,运行任何表达式或应用里面的值可能会发生变化。因此返回地址后,第一之间将改地址的值取出来,重新赋值一下。

img


 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
int* sentence(int arr[3][3], int k);
 
int main()
{
    int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
    printf("请输入要查找的数字\n");
    int k = 0;
    scanf("%d", &k);
    int *ret,*ret1;
    ret1 = sentence(arr,k);
    *ret = *ret1;
    *(ret+1) = *(ret1+1);
    if (ret == NULL)
    {
        printf("没找到");
    }
    else
    {
        printf("找到了: x= %d  ,  y= %d\n", *ret , *(ret + 1));
        printf("也就是: 第 %d 行,第 %d 列\n", *ret, *(ret + 1));
        printf("也就是: 第 %d 行,第 %d 列\n", *ret+1, *(ret + 1)+1);
    }
    
    return 0;
}
 
int* sentence(int arr[3][3], int k)
{
    int x = 0;
    int y = 2;
    
    while (x <= 2 && y>=0)
    {
        if (k > arr[x][y])
        {
            x++;
        }
        else if (k < arr[x][y])
        {
            y--;
        }
        else
        {
            int memory[2] = { x,y };
            return memory;
            break;
        }
    }
    return NULL;
    
}

这是因为在两次printf语句中使用的表达式是不同的。第一个printf语句中使用的表达式为:"找到了: x= %d , y= %d\n",这里打印的是x和y的值。

第二个printf语句中使用的表达式为:"也就是: 第 %d 行,第 %d 列\n",这里打印的是x和y的值加1。

所以,两次printf的输出结果是不一样的。

回答不易 求求您采纳点赞哦 感激不尽

在两次 printf 中,打印的内容是相同的变量,但是它们的输出结果却是不一样的。这是因为两次 printf 中,打印的是相同的变量的不同内存地址的值。

  • 第一次 printf 中,打印的是变量 ret 和 ret + 1 的值,即 x 和 y 的值。

  • 第二次 printf 中,打印的是行数和列数,这需要在第一次的 x 和 y 基础上加 1。

因此,两次 printf 的结果是不一样的。

sentence函数返回的是memory的地址,而memory是局部变量,函数返回后这块内存就被释放了,所以返回的是无效地址。
避免函数返回时变量内存被释放,可以用molloc函数配合free函数动态分配内存,或者将变量用static修饰。如:

static int memory[2];
memory[0]=x,memory[1]=y;
return memory;

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^