2008-12-19 126 views
1

我使用這個例子:複製字符串指針,指針

char *myData[][2] = 
{{"John", "[email protected]"}, 
{"Erik", "[email protected]"}, 
{"Peter","[email protected]"}, 
{"Rikard","[email protected]"}, 
{"Anders","[email protected]"}}; 

char **tableData[6]; 
tableData[0] = myData[0]; 
tableData[1] = myData[1]; 
tableData[2] = myData[2]; 
tableData[3] = myData[3]; 
tableData[4] = myData[4]; 
tableData[5] = NULL;//null terminated array 

,而是希望把我自己的字符串名稱和電子郵件。 (試圖將字符串xyz放入myData,然後tableData) strcpy與myData不會工作。我已經嘗試了指針和引用的所有組合,但它似乎沒有複製字符串。有什麼建議麼?

   ok--> strncpy(xyz, argv[i], strlen(argv[i])); 
      ok--> strcpy(xyz + strlen(argv[i]), "\0"); 
run time stops here--> strncpy(myData[i][0], xyz, strlen(xyz)); 
        tableData[i] = myData[i]; 
+0

這不是問題,但你應該仔細看看strlen()和strncpy()是做什麼的。兩行: ok - > strncpy(xyz,argv [i],strlen(argv [i])); ok - > strcpy(xyz + strlen(argv [i]),「\ 0」); 沒有比 strcpy(xyz,argv [i])更安全(效率也更低)。 – Dipstick 2008-12-19 21:23:05

回答

3

myData[][]中的指針,因爲您已將它初始化爲指向文字字符串。該內存無法寫入。

您可以爲新字符串分配新內存,並將指向新字符串的指針放入myData。或者對於你似乎正在做的事情,只要將指針存儲到argv []字符串(只要你不打算稍後修改字符串)。

此外,請確保您正在複製字符串的內存塊足夠大以容納新字符串。

軟件猴編輯:包括\ 0終止符;並確保在適當的時候釋放內存。

0

創建你自己的數據的本地副本,並改變指針列表:

char **newentry = malloc(sizeof(char*) * 2); 
newentry[0] = strdup(myNewName); 
newentry[1] = strdup(myNewEmail); 
tableData[i] = newentry; 

這是比較容易的部分。當你完成時,困難的部分是釋放內存。如果這只是一點點的C程序,你可能在沒有釋放內存的情況下離開,因爲操作系統會在應用程序退出時自動釋放它。

但是如果你想用大寫「P」做正確,我會做一些小功能,複製和自由表項目:

void tableFreeItem(int i) 
{ 
    if(tableData[i] != 0) 
    { 
     free(tableData[i][0]); 
     free(tableData[i][1]); 
     free(tableData[i]); 
    } 
} 

void tableSetItem(int i, char *name, char *email) 
{ 
    tableFreeItem(i); 

    tableData[i] = malloc(sizeof(char *) * 2); 
    tableData[i][0] = strdup(name); 
    tableData[i][1] = strdup(email); 
} 

現在,我們可以在列表中的項目替換隨意,我們可以通過調用tableFreeItem()函數輕鬆釋放內存。這裏是你如何使用這些功能的例子:

#define TABLE_SIZE 5 

char **tableData[TABLE_SIZE + 1]; /* +1 to make room for NULL terminator */ 

/* Clear out the table. This also sets up the NULL terminator at the end. */ 
    memset(tableData, 0, sizeof(tableData)); 

/* Copy the original data into the table */ 
    for(i = 0; i < TABLE_SIZE; i++) 
     tableSetItem(i, mydata[i][0], myData[i][1]); 

/* Change a data item */ 
    tableSetItem(3, "Adam Pierce", "[email protected]"); 

/* Free memory when we have finished */ 
    for(i = 0; i < TABLE_SIZE; i++) 
     tableFreeItem(i); 

免責聲明:我沒有嘗試過編譯或運行這段代碼,我只是從我的頭頂撞它關閉。它可能會工作。