微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C,按值传递,在Linux中

如何解决C,按值传递,在Linux中

我有一个功能如下:

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) 错误

解决方法

当您在 foo 中 malloc 时,解引用现在指向函数范围内 malloc 的值。这意味着更改了函数内的值,而不是函数外的值。为了更正这个,你不需要在函数内 malloc 来改变 check 的值:

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

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

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

,

您通过指向它的指针的引用将变量 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
,

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

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

#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 作为 &ree 传递给 ref;此地址/指针在函数内部使用 *ref 取消引用以更改 ree 的值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。