#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;
}
为什么两次打印相同的变量,结果却是不一样
看了内存,地址也没变
就是两个第一个printf打印以后,打印的变量就变了。
指针只存储地址,改地址没有声明被占用,运行任何表达式或应用里面的值可能会发生变化。因此返回地址后,第一之间将改地址的值取出来,重新赋值一下。
#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;
不知道你这个问题是否已经解决, 如果还没有解决的话: