簡體   English   中英

strcpy周圍的分段錯誤?

[英]Segmentation fault around strcpy?

我知道你會用指關節敲打我但是。

為什么會出現分段錯誤

char* cmd;
strcpy(cmd, argv[0]);

當這不

char *cmd;
cmd = "plop";

我一段時間沒有練習,也不記得為什么。

ps:實際上,我知道在strcpy之前會有更好的東西

char *cmd = (char*) malloc(strlen(argv[0]));

但我只是想知道為什么這個分段錯誤。

謝謝 !

當你這樣做時:

char * cmd;

你正在堆棧上分配一個指針。 此指針未初始化為任何有意義的值。

然后,當你這樣做:

strcpy(cmd, argv[0]);

您將argv[0]包含的字符串復制到指向cmd的地址,這是......毫無意義的。 既然你很幸運,那只是段錯誤。

當你這樣做:

cmd = "plop";

您將cmd的地址分配給靜態分配的字符串常量。 由於這些字符串是只讀的,因此寫入它們是未定義的行為。

那么,如何解決這個問題呢? 為要寫入的運行時分配內存。 有兩種方法:

第一個是在堆棧上分配數據,如下所示:

char cmd[100]; // for instance

這將在堆棧上分配一個包含100個char的數組。 但是,它不一定是健壯的,因為你必須事先知道你需要多少內存。 堆棧也小於堆。 這導致我們選擇2號選項:

char *cmd = malloc(whatever_you_need); // no need to cast, by the way, unless you're in C++

這會在堆上分配whatever_you_need char 一旦完成,不要忘記free釋放內存。

你得到一個seg。 因為你的第一個例子中的cmd沒有指向任何東西(或者更確切地說,它指向未定義的東西 - 因此嘗試從指針讀取字符或將字符寫入指針可能會導致訪問沖突)。

在第二個示例中,您將cmd設置為指向合法的字符串。

如果你想輕松復制argv [0],

char* cmd = strdup(argv[0]);

當然,你最好檢查strdup的結果是否為null。 :)

我只是想知道為什么這個分段錯誤。

因為如果cmd是一個全局變量,它的值是NULL ,這是不可寫的,如果它是一個局部變量,那么它的值是不確定的,你不應該使用它(但它可以做任何事情,如果你這樣做,這比在許多情況下為NULL)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM