[英]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。
如前所述,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.