【发布时间】:2014-09-19 17:36:12
【问题描述】:
我很好奇为什么当作为参数传递给函数时不能修改结构的变量。我知道参数是按值传递的,但是在传递结构变量时,您将其引用作为值传递。
C 肯定不会在堆栈上创建结构的副本,因为传入的结构引用的值与将结构的指针传递给函数的值相同。
#include <stdio.h>
#include <stdlib.h>
typedef struct String {
char* name;
int x;
} String;
/* Func Protos */
void foo(String str);
void bar(String * str);
void banjo(String str);
int main() {
String str = *(String *)malloc(sizeof(String));
str.x = 5; /* x == 5 */
foo(str); /* x == 5 still */
printf("%d\n", str.x);
banjo(str); /* x == 5 still */
printf("%d\n", str.x);
bar(&str); /* and of course, x = 0 now */
printf("%d\n", str.x);
}
void foo(String str) {
printf("%d\n", str); /* Same value as if we passed String * str */
str.x = 0;
}
void bar(String * str) {
printf("%d\n", *str);
str->x = 0;
}
void banjo(String str) {
printf("%d\n", str);
String * strptr = &str; /* This should be identical to passing String * str */
strptr->x = 0;
}
产生这个输出:
3415000
5
3415000
5
3415000
0
任何帮助将不胜感激!
【问题讨论】:
-
是的,那么您期望会发生什么,为什么?问题是什么?无论如何,C 确实会在堆栈上创建一个副本。
-
你应该传递指针,因为 c 只传递值。
-
"str" 是 struct String 类型的实例,您不能使用 printf 语句一次打印整个结构。因此 "printf("%d\n", str)" 是错误的。
-
那是什么?
String str = *(String *)malloc(sizeof(String)); -
@Ejohnson:在进入讲座模式之前,请考虑问题的前提是错误的可能性:您可以修改作为参数传递给函数的结构,但更改将不可见,因为您正在修改副本。代码包含未定义行为 (IIRC) 的事实无济于事。
标签: c function struct parameters reference