strcpy 與 用“ = ”直接賦值有什麼區別

總結:strcpy是深拷貝,=都是淺拷貝;但是之間的修改不會影響另外一個;

1、使用strcpy時會有兩個“字符串”;而使用“=”只有一個字符串;

2、strcpy是將字符串拷貝到指定的地址;

 

像瞭解其中奧祕必須要讀懂下面幾行代碼;

void test() {
1	char * str1 = "字符串";//在棧區聲明一個  char* 變量str1 並初始化它,讓他指向data區的 “字符串”
2   //char * str1 ="字符串2";//erro 多次初始化

3	char * str2 = str1;//在棧區聲明一個char* 變量str2;並給將str1中的值複製給它.
                       //str1中存儲的就是堆區“字符串”的地址;這一個過程不是初始化,
                       //所以後面str2還可執行str2 = "字符串3"這一操作

4  str2 = "字符串3";
 }

 

查一查手冊

strcpy的內存模型

從“把 src 所指向的字符串複製到 dest”這一句我們能知道大概是下面這個

代碼驗證;

void test() {
	char * str1 = "1234";
	char * str2 = (char *)malloc(4);

	printf("str1的地址:%p\n", str1);
	printf("str2的地址:%p\n", str2);

	strcpy(str2, str1);
	printf("str2使用了strcopy後的地址:%p\n", str2);
	str2 = "2345";
	printf("改變str2後str1的值:%s\n", str1);
	printf("改變str2後str1的地址;%p\n", str1);
	printf("改變str2的str2的地址:%p\n", str2);
}

打印結果:

 

“=” 的模型

代碼驗證

void test1() {
	char * str1 = "1234";
	char * str2 = (char *)malloc(4);

	printf("str1的地址:%p\n", str1);
	printf("str2的地址:%p\n", str2);

	str2 = str1;
	printf("執行了str2 = str1之後str2的地址:%p\n", str2);
	str2 = "2345";
	printf("改變str2後str1的值:%s\n", str1);
	printf("改變str2後str1的地址;%p\n", str1);
	printf("改變str2的str2的地址:%p\n", str2);

}

打印結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章