-3

我有一个功能如下:

void foo (int *check){
*check= 9;
printf("*check: %d\n",*check);
//when I print "*check" here, the value changes as 9.
}

这是主要功能。

void main () {
int check=5;
foo(&check);
printf("check: %d\n",check);
//when I print "check", gives me 5. 
}

我想更改“检查”变量的值,但它不起作用。我在哪里犯错?谢谢!

我在运行时使用makefile。编辑: malloc 已被删除,现在它给了我 Segmentation fault (core dumped) 错误

4

4 回答 4

1

当您在 foo 中进行 malloc 时,取消引用现在指向函数范围内 malloc 的值。这意味着函数内的值被更改,而不是函数外的值。要更正此问题,您无需在函数内进行 malloc 更改检查的值:

void foo (int *check) {
    *check= 9;
}

void main () {
    int check = 5;
    foo(&check); // check is now 9
}
于 2021-07-27T09:02:31.510 回答
0

您通过指向它的指针通过引用将变量传递check给函数foo

int check=5;
foo(&check);

因此,取消引用指针,您可以直接访问变量检查并可以像这样更改它

*check= 9;

但是在函数中,您使用动态分配的内存的新地址重新分配了指针

check=  malloc(sizeof(int));

所以现在指针check不指向通过引用传递给函数的原始对象。结果这个声明

*check= 9;

更改类型的动态分配对象,int而不是更改通过引用传递给函数的变量。

编辑: malloc 已被删除,现在它给了我 Segmentation fault (core dumped) 错误

如此大幅度地更改问题中的代码是一个坏主意,因为它只会使问题和答案的读者感到困惑。不应发生分段错误。问题中提供的新代码似乎与生成分段错误的实际代码不对应。

这是一个演示程序。它编译并成功运行。

#include <stdio.h>

void foo ( int *check )
{
    *check = 9;
    printf( "Inside foo check = %d\n", *check );
}

int main(void) 
{
    int check = 5;
    
    printf( "Before foo check = %d\n", check );
    
    foo( &check );
    
    printf( "After  foo check = %d\n", check );

    return 0;
}

程序输出为

Before foo check = 5
Inside foo check = 9
After  foo check = 9
于 2021-07-27T09:08:28.127 回答
0

您所做的一切都很好,唯一错误的是尝试malloc传递给函数的变量,因为它已经在堆栈上分配。为了做你想做的事,你应该将整数声明为指向函数外部int *check整数 ( )的指针,并在以指针作为参数调用函数时避免使用字符。&

于 2021-07-27T09:01:07.400 回答
0

要通过函数更改变量,您需要通过引用而不是值来传递它。您的标题和代码不匹配。

这是一个包含两种论点的版本,并排:

#include <stdio.h>

int foo(int *ref, int val) {
    *ref = 1122;                   // by reference
    val = 1155;                    // by value
    printf("inside:\n%d %d\n", *ref, val);
    return val;                    // otherwise "val=1155" is lost
}
int main(void) {
    int ree = 12;         // "referencee"
    int v = 15;

    printf("main:\n%d\n", foo(&ree, v));    // return value (1155)
    printf("%d %d\n", ree, v);              // 1122 and 15

}

ree被传递&reeref; 这个地址/指针在函数内部被取消引用*ref以改变ree's 的值。

于 2021-07-27T09:27:04.117 回答