簡體   English   中英

C中的strtok segmentfault后的strcpy

[英]strcpy after strtok segmentfault in C

char test[10]="ab cd";
char* save=NULL;

save = strtok(test," ");
printf("%s\n",save);

結果:ab

首先,以上代碼效果很好。

接下來,我嘗試執行此代碼。 但是,發生段故障。

char test[10]="ab cd";
char* save=NULL;
char* cpy=NULL;

save = strtok(test," ");
strcpy(cpy,save);
printf("%s\n",cpy);

我知道strtok()返回只讀* char類型。 但是,我想,“保存”僅用於復制的對象。

它沒有改變。 為什么strcpy()通過獲取'save'作為參數使segmentfault錯誤?

您的char *cpy沒有引用任何已分配的內存。 (將其初始化為NULL 。因此,當您調用strcpy(cpy,save) ,您正在寫入NULL指針。

您可能要先分配內存:

cpy = malloc(strlen(save)+1);
strcyp(cpy,save);

strcpy情況下,您必須首先為“ cpy”分配內存,以便可以將“保存”復制到“ cpy”。 這里的“保存”工作正常,因為strtok僅在成功時返回指針...這就是為什么您不需要為“保存”分配內存。並且您通過保存傳遞地址因此就可以了。為“ cpy”,以便strcpy可以將“保存”復制到“ cpy”中。

當您將cpy復制到它指向的位置時,它顯式為NULL。 這樣可以保證給您某種內存寫入錯誤。

我建議您初始化cpy以指向一些實際可用的內存,例如:

char temp[100];
char test[10]="ab cd";
char* save=NULL;
char* cpy=temp; // Set cpy to point to temp buffer

save = strtok(test," ");
strcpy(cpy,save);
printf("%s\n",cpy);

不是strtok()導致了問題,而是strcpy()進入了地址0。

使用strdup

save = strtok(test," ");
cpy = strdup(save);
printf("%s\n",cpy);
free(cpy);

完成操作后,不要忘記釋放內存。

請閱讀

如前所述,strcpy()和大多數字符串例程一樣,如果傳遞NULL參數,則將出現段錯誤。 這適用於src和dest args(至少在舊版本的glibc中),這使得無法執行以下簡單操作:

strcpy(dest, strtok(NULL, “ “));
strcpy(dest, getenv(“NOTHNG”);

strtok()或getenv()都可以返回NULl,該值將傳遞給strcpy()導致段錯誤。 我不想在代碼中放入很多NULL檢查,例如:

if (getenv(“NOTHING”) != NULL)
    *dest = ‘\0’;
else
    strcpy(dest, getenv(“NOTHING”));

因此,我創建了一個strcpy_w()包裝器,將NULL src參數視為與* src為'\\ 0'相同。 對於其他字符串函數,我也進行了相同的操作,還檢查了緩沖區溢出。 然后,我只需要添加以下內容即可始終使用包裝器:

#define strcpy(x, y) strcpy_w(x, y)

或者,我可以改為調用strcpy_w(dest,getenv(“ NOTHING”))。

暫無
暫無

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

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