問題:https ://leetcode.com/problems/find-and-replace-in-string/
"""
char * findReplaceString(char * s, int* indices, int indicesSize, char ** sources, int sourcesSize, char ** targets, int targetsSize){
int len = strlen(s);
char *copyS;
char *copy = (char*) malloc(sizeof(char)*len);
memcpy(copy, s, sizeof(char)*len);
copyS = copy;
int x = indicesSize-1;
int indexArr[1001] = {0};
int y;
for(int j=0; j<indicesSize; j )
{
indexArr[indices[j]] = j;
}
qsort(indices, indicesSize, sizeof(int), cmp);
while((x >= 0))
{
y = indexArr[indices[x]];
copy = copyS (indices[x]);
if(!(strncmp(copy, sources[y], strlen(sources[y]))))
{
copy = (char *)realloc(copy, sizeof(char)*(sizeof(copy) sizeof(targets[y])));
strcpy(copy, targets[y]);
}
x--;
}
return copyS;
}
由于使用 realloc,我收到運行時錯誤。我試圖修改輸入字串's'。由于 realloc 導致運行時錯誤:嘗試釋放未分配的記憶體。所以我分配了新的字串指標,*copy。當我在副本上使用 realloc 時仍然出現同樣的錯誤
uj5u.com熱心網友回復:
代碼有幾個問題。
對于初學者來說,指標指向的動態分配的陣列是否copy應包含字串尚不清楚。
如果它應該包含一個字串,那么而不是
char *copy = (char*) malloc(sizeof(char)*len);
memcpy(copy, s, sizeof(char)*len);
你需要寫
char *copy = (char*) malloc(sizeof(char)*( len 1 ));
memcpy(copy, s, sizeof(char)*( len 1 ));
也不清楚為什么1001在這個宣告中使用了幻數
int indexArr[1001] = {0};
指標copyS被分配了最初分配的記憶體的地址
char *copyS;
char *copy = (char*) malloc(sizeof(char)*len);
memcpy(copy, s, sizeof(char)*len);
copyS = copy;
但是你正在嘗試重新分配記憶體
copy = (char *)realloc(copy, sizeof(char)*(sizeof(copy) sizeof(targets[y])));
結果,指標copyS可能具有無效值。并且這個具有無效值的指標從函式中回傳
return copyS
copy依次在 while 回圈內更改指標
while((x >= 0))
{
y = indexArr[indices[x]];
copy = copyS (indices[x]);
//..
因此,在這樣的分配之后,它不會指向先前分配的記憶體范圍。因此在呼叫中使用指標realloc
copy = (char *)realloc(copy, sizeof(char)*(sizeof(copy) sizeof(targets[y])));
呼叫未定義的行為。
再次宣告
copy = copyS (indices[x]);
還呼叫未定義的行為,因為在記憶體重新分配之后指標copyS可能無效。
uj5u.com熱心網友回復:
一旦你這樣做
copy = copyS (indices[x]);
您不能再使用 'copy' 作為reallocor的引數free。您傳遞給這些函式的指標必須是先驗malloc或realloc(或calloc)回傳的值
將原始“副本”保存在像“originalCopy”這樣的變數中
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/444620.html
下一篇:什么是C 中的別名?
