如何解决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 举报,一经查实,本站将立刻删除。