亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 4600 | 回復(fù): 21
打印 上一主題 下一主題

[C] 有點暈了~,誠心請教strcpy的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-01-14 17:03 |只看該作者 |倒序瀏覽
1. char *strcpy( char *to, const char *from );
我的理解是:strcpy時,to必須先申請好一段空間

例1:
main()
{
        char* dst;
        char* src = "hello";
        strcpy(dst, src);
        printf("src=%s\n",src);
        printf("dst=%s\n",dst);
}
windows下運行沒有警告和錯誤,結(jié)果:
src=hello
dst=hello
請按任意鍵繼續(xù). . .

例2:
main()
{
        char* src = "hello";
        char* dst;
        strcpy(dst, src);
        printf("src=%s\n",src);
        printf("dst=%s\n",dst);
}
windows下運行沒有警告和錯誤,但是卻彈出系統(tǒng)錯誤,提示“遇到問題需要關(guān)閉..“,也沒有輸出。

例3:
main()
{
        char src[] = "hello";
        char* dst;
        strcpy(dst, src);
        printf("src=%s\n",src);
        printf("dst=%s\n",dst);
}
windows下運行沒有警告和錯誤,結(jié)果:
src=hello
dst=hello
請按任意鍵繼續(xù). . .

以上三例中,dst都是個野指針,也都沒有先申請好空間,為什么例1和例3可以正常輸出,而例2不能?
還有一點疑惑:教程中說:”未初始化的指針是非常危險的,所以應(yīng)總是在聲明指針時對它進行初始化“,可是看了很多高手的代碼,有時會對聲明的指針進行初始化,有時又就聲明個指針放哪,也不初始化,不知道他們這樣做是否妥當(dāng)?

論壇徽章:
0
2 [報告]
發(fā)表于 2009-01-14 17:12 |只看該作者
這和 strcpy() 已經(jīng)沒有關(guān)系了,這就好像桌上放著茶杯,你倒茶沒往客人的茶杯里倒,這時候既可能倒在桌上,也可能倒在自己的茶杯里,還可能倒在桌子外面的地上——假如你足夠分心的話。

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
3 [報告]
發(fā)表于 2009-01-14 17:18 |只看該作者
跟你定義的變量在內(nèi)存中的布局有關(guān),也就是說跟編譯器相關(guān),報不報錯誤跟操作系統(tǒng)有關(guān)。

論壇徽章:
0
4 [報告]
發(fā)表于 2009-01-14 17:18 |只看該作者
樓上的意思是:例1和例3編譯運行的時候,是我運氣好?水正好倒在了杯子里?

論壇徽章:
0
5 [報告]
發(fā)表于 2009-01-14 17:24 |只看該作者
正確的做法是不是要先給strcpy的目的地址申請好一段足夠的空間?
看別人的代碼里定義指針的時候,有時候會初始化,有時又不初始化,這樣做會不會出問題?

論壇徽章:
0
6 [報告]
發(fā)表于 2009-01-14 17:29 |只看該作者
memcpy的時候,目的地址是不是也要先申請好一段足夠的空間?

論壇徽章:
0
7 [報告]
發(fā)表于 2009-01-14 17:32 |只看該作者
原帖由 mathieu 于 2009-1-14 17:29 發(fā)表
memcpy的時候,目的地址是不是也要先申請好一段足夠的空間?


看你在哪里用,如果是數(shù)據(jù)段或者堆棧的話就不必事先打報告,直接可以用。

論壇徽章:
0
8 [報告]
發(fā)表于 2009-01-14 17:42 |只看該作者
原帖由 langue 于 2009-1-14 17:32 發(fā)表


看你在哪里用,如果是數(shù)據(jù)段或者堆棧的話就不必事先打報告,直接可以用。


弱弱地問:什么叫數(shù)據(jù)段或者堆棧?可以舉個例子嗎?

論壇徽章:
0
9 [報告]
發(fā)表于 2009-01-14 17:42 |只看該作者
memcpy的時候,目的地址是不是也要先申請好一段足夠的空間?

--對,你其實已經(jīng)明白了.

有的例子能跑,只是因為運氣,同樣程序你再跑兩次,可能一會ok,一會core dump

這就是undefined behaviour的典型表現(xiàn)

論壇徽章:
0
10 [報告]
發(fā)表于 2009-01-14 17:58 |只看該作者
原帖由 mathieu 于 2009-1-14 17:42 發(fā)表


弱弱地問:什么叫數(shù)據(jù)段或者堆棧?可以舉個例子嗎?

  1. /* dataseg.c  -  data segment example */
  2. #include <stdio.h>
  3. #include <string.h>

  4. char a[64]; /* so let's keep the output small */

  5. int
  6. main(void)
  7. {
  8.     printf("%s", strcpy(a, "Hello world from data segment!\n"));
  9.     return 0;
  10. }
復(fù)制代碼

  1. /* stack.c  -  stack example */
  2. #include <stdio.h>
  3. #include <string.h>

  4. int
  5. main(void)
  6. {
  7.     char a[64];
  8.     printf("%s", strcpy(a, "Hello world from stack!\n"));
  9.     return 0;
  10. }
復(fù)制代碼

  1. /* heap.c  -  heap memory example */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h> /* malloc() */

  5. int
  6. main(void)
  7. {
  8.     char *p = NULL;

  9.     p = (char *)malloc(64);

  10.     if (p) {
  11.         printf("%s", strcpy(p, "Hello world from heap memory!\n"));
  12.         free(p);
  13.         return 0;
  14.     } else {
  15.         fprintf(stderr, "Unable to allocate memory.\n");
  16.         return -1;
  17.     }
  18. }
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP