對于此作業,我應該從命令列引數中獲取多個名稱,這些名稱以“ ”(將名稱插入到我的鏈接串列中)或“-”(從串列中洗掉名稱)開頭,因此如果我要輸入“ bill jim ted -bill”,我會添加不帶“ ”的這三個名稱并洗掉 bill。我嘗試使用動態分配一個字串,malloc以便我可以修改該name字串,但是我的代碼沒有將字串資料插入到我的鏈表中,并且當我通過一些測驗字串時,我得到了一個 free(): invalid pointer 錯誤。如果我將free(name)陳述句移動到 if/else if 陳述句,則會出現分段錯誤。我將如何正確地從命令列動態分配這些字串以便可以修改它們?
int main(int argc, char *argv[]){
struct node* head;
for(int x = 0; x < argc; x ){
char * name = malloc((strlen(argv[x]) 1));
name = argv[x];
if(name[0] == ' '){
printf("adding %s \n", name );
insert(&head, name );
printf("List: ");
printList(&head);
}
else if(name[0] == '-'){
printf("removing %s \n", name );
removeNode(&head, name );
}
free(name);
}
}
char * removeNode(struct node** head, char* name){
struct node *current = *head;
struct node *previous;
if(current == NULL){
return "error0";
}
if(current->data == name){
struct node * node2delete= *head;
*head = node2delete->next;
char * name2 = malloc(strlen(name) 1);
strcpy(name2, name);
free(node2delete);
printf("Removed %s \n", name);
return name2;
}
while(current != NULL){
previous = current;
current = current->next;
if(current->data == name){
previous->next = current->next;
char * name2 = malloc(strlen(name) 1);
strcpy(name2, name);
free(current);
printf("Removed %s \n", name);
return name2;
}
}
return "error0";
}
uj5u.com熱心網友回復:
嘗試使用strcpy(name, argv[x]);而不是name = argv[x],因為當您將指標分配給指標時,它們將導致存盤以空字符結尾的字符陣列的相同記憶體位置。這樣您就可以在呼叫 free(name); 時為 argv[x] 完成記憶體釋放。
指標操作與賦值不同。
另請參閱此執行緒:malloc() 和 free() 如何作業?
uj5u.com熱心網友回復:
很多問題
字串復制不正確
//char * name = malloc((strlen(argv[x]) 1));
//name = argv[x];
char * name = malloc(strlen(argv[x]) 1);
if (name == NULL) return EXIT_FAILURE; // Out of memory
strcpy(name, argv[x]);
不正確 free()
代碼需要釋放從分配中收到的相同值。name 搞砸了。
未初始化的頭部*
// struct node* head;
struct node* head == NULL;
更多的
可能只需要在添加時分配,然后分配 /-。
int main(int argc, char *argv[]){
struct node* head = NULL;
// for(int x = 0; x < argc; x ){
for(int x = 1; x < argc; x ){ // Skip adding the program name, start at 1
if(argv[x][0] == ' '){
char * name = malloc((strlen(argv[x] 1) 1));
if (name == NULL) return EXIT_FAILURE; // Out of memory
strcpy(name, argv[x]);
printf("adding %s \n", name); // No
insert(&head, name); // No
printf("List: ");
printList(&head);
}
else if(argv[x][0] == '-'){
printf("removing %s \n", argv[x] 1);
// This is a problem, I'd expect removeNode() to return a pointer to the free'd name
char *name = removeNode(&head, argv[x] 1);
free(name);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/370918.html
