2013-11-25 4 views
4

у меня есть указатель на указатели на символ установлен как:Назначение указателей на указатели

char **A; 
    char **B; 

творю строку сортировки с помощью Radix сортировки, и я должен уладить это несколько раз, но если сортировать его, это просто сортировка массива A и сохраняет результат в массиве B. То, что я хочу сделать, это назначить A быть B, который уже почти отсортированных A, но когда я делаю:

A = B; 

Я просто установить указатели, не так ли? Это означает, что A указывает сейчас на B. И, когда я позже переопределяю значения, у меня есть несколько результатов одной и той же строки. Например:

A = {"aa", "ba", "bc", "bd"}; 

После сортировки и с помощью A = B, выглядит результат:

B = {"aa", "aa", "bc", "bd"}; 

Я также попытался с помощью memcpy() - который должен копировать то, что B указывает на на место, которое указал на A, правильно ? Но результат тот же. Не знаю, как заставить это работать. Не был уверен, разместить здесь полный код, поэтому я загрузил его на pastebin.

Благодарим за любую помощь заранее.

Редактирование2: с небольшой помощью, сменил его, и он отлично работает с memcpy(), но он по-прежнему не является «стабильным», а вместо B = {"bb", "bc"} У меня есть противоположное: B = {"bc", "bb"}. Я все еще сражаюсь с ним, но никаких результатов пока нет.

void CSort(int p){ 

int k = 123; 
int C[k]; 
int i; 

for(i = 0; i <= k; i++){ 
    C[i] = 0; 
} 

for(i = 0; i < ILE; i++){ 
    C[(int)As[i][p]]++; 
} 

for(i = 1; i <= k; i++){ 
    C[i] = C[i] + C[i - 1]; 
} 

for(i = 0; i < ILE; i++){  // ile means how many words there are 
    Bs[C[(int)As[i][p]] - 1] = As[i]; 
    printf("As[%i][%i] == %c ", i, p, As[i][p]); 
    printf("C[%i] == %i ", (int)As[i][p], C[(int)As[i][p]]-1); 
    printf(" Bs[%i] == %s \n", C[(int)As[i][p]] - 1, Bs[C[(int)As[i][p]] - 1]); 

    //(As[i], Bs[C[(int)As[i][p]]], sizeof(As[i])); 
    C[(int)As[i][p]]--; 
} 


} 

Это мой Counting дешево, и тут приходит мой десятичную:

void RSort(int d){ 
    int i; 
    for(i = d; i >= 0; i--){ 
     CSort(i); 
     memcpy(As, Bs, sizeof(*As) * ILE); 
    } 
} 

Я даже не получил идея - почему - потому что на бумаге, она работает просто отлично!

Чтобы исправить мою проблему, все, что я должен был сделать, должно было изменить порядок, в последнем цикле:

for(i = 0; i < ILE; i++) 

изменение

for(i = ILE - 1; i >= 0; i--) 

И все работает просто отлично!

+1

Проблема в коде. Попытайтесь разбить его и скопируйте разделенную версию здесь. – perror

+0

ваши poiters указатели неинициализированы в два раза, а код, который вы отправили здесь, присваивает указателям _constants_ указателям, они доступны только для чтения и не могут быть запутаны. Besisdes: 'sizeof (ptr_var)', вероятно, 4 (или 8, если 64 бит) –

+0

'A = {" aa "," ba "," bc "," bd "};' недопустимый синтаксис – newacct

ответ

2

При назначении

A = B; 

присвоить A, чтобы указать на ту же память B точки на, не A, чтобы указать на B.

Чтобы скопировать массив, который нужно будет выделить память для хранения его и тетсру все содержимое из B в A

char ** A = malloc(sizeof(*A) * numitems); 
memcpy(A, B, sizeof(*A) * numitems); 

Тогда при сортировке A или B это не будет влиять на других, потому что у вас есть копии.

Смежные вопросы