提问人:helloword 提问时间:7/27/2021 最后编辑:helloword 更新时间:7/27/2021 访问量:87
C,按值传递,在 Linux 中 [已关闭]
C, pass by value, in Linux [closed]
问:
我有一个功能如下:
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 现在被删除了,它给了我分段错误(核心转储)错误
答:
你做得很好,唯一错误的是尝试你传递给函数的变量,因为它已经在堆栈上分配了。为了执行您要执行的操作,应将整数声明为指向函数外部整数 () 的指针,并在调用具有指针作为参数的函数时避免使用该字符。malloc
int *check
&
评论
check
当您在 foo 中 malloc 时,取消引用现在指向函数范围内的值 malloced。这意味着函数内的值会更改,而不是函数外部的值。要更正此问题,您无需在函数中 malloc 更改 check 的值:
void foo (int *check) {
*check= 9;
}
void main () {
int check = 5;
foo(&check); // check is now 9
}
评论
通过指向函数的指针引用将变量传递给函数check
foo
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
要通过函数更改变量,您需要通过引用而不是值来传递它。您的标题和代码不匹配。
下面是一个并排包含两种参数的版本:
#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
上一个:将全局变量作为参数传递给方法
下一个:C++,按指针传递 [复制]
评论
check= malloc(sizeof(int));
check= malloc(sizeof(int));
覆盖传递给函数的值,并造成内存泄漏。