【问题标题】:C, pass by value, in Linux [closed]C,按值传递,在Linux中[关闭]
【发布时间】:2021-10-03 02:19:48
【问题描述】:

我有一个功能如下:

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. 
}

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

我在运行时使用 makefile。 编辑: malloc 已被删除,现在它给了我分段错误(核心转储)错误

【问题讨论】:

  • 你为什么在 foo 中调用 malloc?
  • Skip check= malloc(sizeof(int)); 编译器已经为您传递指针的变量分配了内存。
  • check= malloc(sizeof(int)); 会覆盖传递给函数的值,也会造成内存泄漏。
  • “给我分段错误”无法重现,但您还没有发布Minimal Reproducible Example,这是显示您尝试过的最短的完整代码。
  • 这段代码不起作用的原因。您在堆栈上创建一个变量并将其分配给五个,然后将指针传递给函数中的变量,在第一行的函数中,您将指针更改为堆中新分配的内存。第二行更新堆中的内存。最后,您有指向堆内存的指针,其值为 9,堆栈上的变量仍为 5。如果要更改堆栈上的变量,请不要更改函数内的指针(malloc 行)。

标签: c pass-by-value pass-by-pointer


【解决方案1】:

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

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

void main () {
    int check = 5;
    foo(&check); // check is now 9
}

【讨论】:

  • 在这种情况下,我收到此错误:分段错误(核心转储)。我假设在执行取消引用行时会发生这种情况。
  • @helloword 这个代码是正确的。还有其他事情你做错了。也许就这个确切的问题提出一个新问题。
【解决方案2】:

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

【讨论】:

  • 为什么 OP 要将check 定义为指针?没有必要这样做。
  • 在我看来他正在尝试学习如何动态分配内存,否则他不会(错误地)调用 malloc 函数。
  • 也许,也许不是。没有说明代码的用途。
【解决方案3】:

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

这是一个同时包含两种参数的版本:

#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 作为&amp;ree 传递给ref;这个地址/指针在函数内部被取消引用,*ref 改变了ree 的值。

【讨论】:

    【解决方案4】:

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

    int check=5;
    foo(&check);
    

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

    *check= 9;
    

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

    check=  malloc(sizeof(int));
    

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

    *check= 9;
    

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

    编辑:malloc 已被删除,现在它给了我分段错误(核心 转储)错误

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

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

    #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
    

    【讨论】:

      猜你喜欢
      • 2013-01-22
      • 2020-01-15
      • 2017-05-17
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2023-03-02
      • 2014-10-03
      相关资源
      最近更新 更多