struct 传参改变内容

今天想到一个问题,就是 struct 的传参和数组的传参的区别,先看代码

#include <stdio.h>
#include <string.h>

struct d {
    int n;
    char str[100];
};

void chg(struct d *a) {
    a->n = 1;
    strcpy(a->str, "changing");
    printf("%dn", a->n);
    printf("%sn", a->str);
}

void chg_arr(char str[]) {
    strcpy(str, "changing arr");
    printf("%sn", str);
}

int main() {
    struct d a;
    a.n = 2;
    strcpy(a.str, "before change");
    printf("%dn", a.n);
    printf("%sn", a.str);
    chg(&a);
    strcpy(a.str, "after change");
    printf("%dn", a.n);
    printf("%sn", a.str);

    char str[100] = "before arr change";
    printf("%sn", str);
    chg_arr(str);
    printf("%sn", str);
    return 0;
}

输出如下

2
before change
1
changing
1
after change
before arr change
changing arr
changing arr

数组传参那段好理解,实参进入函数退化成指针,指向同一片内存,所以自然就改变了内容,但是 struct 那段有点意思,包在结构体里面的数组,在传参的时候却是被复制了一份,这其实意味着在某些场合可以把数组包在结构体里面传来传去吧

=========================================

2012-10-07 15:39:00 uodate 上面的代码贴错了,在 lan 同学的指正下,修改如下

#include <stdio.h>
#include <string.h>

struct d {
	int n;
	char str[100];
};

void chg(struct d a) {
	a.n = 1;
	strcpy(a.str, "changing");
	printf("%dn", a.n);
	printf("%sn", a.str);
}

void chg_arr(char str[]) {
	strcpy(str, "changing arr");
	printf("%sn", str);
}

int main() {
	struct d a;
	a.n = 2;
	strcpy(a.str, "before change");
	printf("%dn", a.n);
	printf("%sn", a.str);
	chg(a);
	strcpy(a.str, "after change");
	printf("%dn", a.n);
	printf("%sn", a.str);

	char str[100] = "before arr change";
	printf("%sn", str);
	chg_arr(str);
	printf("%sn", str);
	return 0;
}

输出

2
before change
1
changing
2
after change
before arr change
changing arr
changing arr

这个才是达到了传一个结构体会在传参的时候复制一份的效果

2 thoughts on “struct 传参改变内容

  1. 那个结构体里的数组没复制一份啊。三次打印不一样是因为你复值过三次啊。如果结构体传值的话,倒是可以复制一份数组的

    • 嗯嗯,修改过来了,之前测试完传值之后又试了一下传指针,结果最后就把传指针的代码贴上来,贴串了。。囧。。

Leave a Reply

Your email address will not be published. Required fields are marked *