C,按值传递,在 Linux 中 [已关闭]

C, pass by value, in Linux [closed]

提问人:helloword 提问时间:7/27/2021 最后编辑:helloword 更新时间:7/27/2021 访问量:87

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将有助于其他人回答这个问题。

2年前关闭。

我有一个功能如下:

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 现在被删除了,它给了我分段错误(核心转储)错误

C 按值传递

评论

3赞 Timbo 7/27/2021
你为什么要在 foo 里面叫 malloc?
3赞 Some programmer dude 7/27/2021
跳过 编译器已为您传递指针的变量分配内存。check= malloc(sizeof(int));
1赞 Weather Vane 7/27/2021
check= malloc(sizeof(int));覆盖传递给函数的值,并造成内存泄漏。
1赞 Weather Vane 7/27/2021
“gives me Segmentation fault”无法重现,但您尚未发布最小可重现示例,这是显示您尝试过的内容的最短的完整代码。
1赞 Dima 7/27/2021
此代码不起作用的原因。在堆栈上创建一个变量并将其分配给 five,然后将指针传递给函数中的变量,在函数的第一行中,将指针更改为堆中新分配的内存。第二行更新堆中的内存。最后,指针指向值为 9 的堆内存和堆栈上的变量,该变量仍为 5。如果要更改堆栈上的变量,请不要更改函数(malloc 行)中的指针。

答:

0赞 Nastor 7/27/2021 #1

你做得很好,唯一错误的是尝试你传递给函数的变量,因为它已经在堆栈上分配了。为了执行您要执行的操作,应将整数声明为指向函数外部整数 () 的指针,并在调用具有指针作为参数的函数时避免使用该字符。mallocint *check&

评论

1赞 Gerhardh 7/27/2021
为什么 OP 要定义为指针?没有必要这样做。check
0赞 Nastor 7/27/2021
在我看来,他正在尝试学习如何动态分配内存,否则他不会(错误地)调用 malloc 函数。
1赞 Gerhardh 7/27/2021
也许,也许不是。没有关于代码目的的指示。
1赞 PotatoParser 7/27/2021 #2

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

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

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

评论

0赞 helloword 7/27/2021
在这种情况下,我收到此错误:分段故障(核心转储)。我假设这在取消引用行执行时发生。
0赞 Jabberwocky 7/27/2021
@helloword此代码是正确的。你还做错了什么。也许就这个确切的问题提出一个新问题。
0赞 Vlad from Moscow 7/27/2021 #3

通过指向函数的指针引用将变量传递给函数checkfoo

int check=5;
foo(&check);

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

*check= 9;

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

check=  malloc(sizeof(int));

所以现在指针不指向通过引用传递给函数的原始对象。因此,这句话check

*check= 9;

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

编辑:malloc 现在被删除了,它给了我分段错误(核心 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
0赞 user16455232 7/27/2021 #4

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

下面是一个并排包含两种参数的版本:

#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*refree