初学者 C 编程将指针传递给函数会给出不可预测的结果



我正在学习C作为课程的一部分,我仍在学习指针的概念。以下示例为我提供了不可预测的结果。

#include <stdio.h>
void Calculate(int *x, int *y, int *k, int *m) {
k = *x * *y;
m = *x + *y;
}
int main() {
int *k;
int *m;
int g = 10;
int h = 11;
Calculate(&g, &h, k, m);
printf("%dn", m);
printf("%d", k);
}

每次执行都会给我不同的结果,比如

-1155180448
0

253276384
0

或 591649904 0

但是如果我将代码更改为

#include <stdio.h>
void Calculate(int *x, int *y, int *k, int *m) {
*k = *x * *y;
*m = *x + *y;
}
int main() {
int k;
int m;
int g = 10;
int h = 11;
Calculate(&g, &h, &k, &m);
printf("%dn", m);
printf("%d", k);

}

它打印正确的值,例如

21
110

使用int *k; int *m;并将其传递给函数不是somefunc(k, m)int k; int m; somefunc(&k, &m)相同吗?

请解释这里有什么问题。

谢谢。

函数应该是:

void Calculate(int *x, int *y, int *k, int *m) {
    *k = *x * *y;
    *m = *x + *y;
}

*k表示存储在内存中的intk指向。您不想修改k ,而是要修改存储在k指向的空间中的内容。

然后你这样打电话:

int a, b;
int g = 10;
int h = 11;
Calculate(&g, &h, &a, &b);

你告诉Calculate函数在内存中的下落,ab变量将保存计算结果。

注意:我使用了不同的变量名称,因为在一个地方对int使用相同的名称k,而在另一个地方对int *使用相同的名称k会令人困惑。当然,另一个计划是在main中使用k,m,并在函数中使用pkpm(意思是"指向k的指针"等)。

此外,您不需要使用指针来传递gh实际上这是一个坏主意,除非您也打算在函数中更改它们。

如果您真的想像第一个示例中一样测试此调用Calculate(&g, &h, k, m);,将整数gh和整数指针传递*k*m,首先确保指针确实指向某些内容,以便Calculate()函数可以将它们视为整数变量的地址, 或任何语法功能。

#include <stdio.h>   
#include <stdlib.h>  //add this header for malloc
void Calculate(int *x, int *y, int *k, int *m) {
  *k = *x * *y;
  *m = *x + *y;
}
int main() 
{
  int *k = malloc(sizeof(int)); //initialize the pointer to point at something
  int *m = malloc(sizeof(int)); //initialize the pointer to point at something
  int g = 10;
  int h = 11;
  Calculate(&g, &h, k, m);
  printf("%dn", *m);
  printf("%dn", *k);
  free(k);    //free the space pointed to by pointers!
  free(m);
return 0;
}

这不是一个非常实用的解决方案(至少就您的示例而言),但这里只是为了展示您应该如何将指针视为调用方函数中的函数参数。

最新更新