C: Передав указатель вниз, обновленный указатель не может быть доступен из вызывающих функций! - PullRequest
0 голосов
/ 07 октября 2010

У меня проблема - я назначаю переменную-указатель чему-то в вызываемой функции, но при попытке доступа к обновленному указателю в вызывающих функциях он не отображается как обновленный и приводит к ошибке сегмента.Help!

«Самая низкая функция»:

void compareStrings(char* firstFrag, char* secondFrag, int* longestCommonLength, char* suffix, char* prefix, int* relative_pos) {
    suffix = firstFrag;
    prefix = secondFrag;
}

Вызывается из этой функции (printf вызывает ошибку)

int findBestOverlap(char* fragmentArray[], int fragmentCount, int* longestCommonLength, char* suffix, char* prefix, int* relative_pos) {
    compareStrings(fragmentArray[firstFrag], fragmentArray[secondFrag], longestCommonLength, suffix, prefix, relative_pos);
    printf("LCL: %i || PREFIX: %s || SUFFIX: %s", *longestCommonLength, prefix, suffix);
}

Префикс и суффикс переменныхв свою очередь, созданный в более высокой вызывающей функции processStrings.

void processStrings(char* fragmentArray[], int fragmentCount) {
    int longestCommonLength = 0;
    char* suffix;
    char* prefix;
    int relative_pos;  // Where the first letter of suffix is, vis-a-vis prefix

    if ((findBestOverlap(fragmentArray, fragmentCount, &longestCommonLength, suffix, prefix, &relative_pos)) != 0) {
    }
}

Help!

Ответы [ 2 ]

3 голосов
/ 07 октября 2010

Вы не обновляете указатель, вы просто меняете локальное значение аргумента.Вам нужно использовать указатель указателя (например, char**) и изменить вместо него указательное значение.

void compareStrings(char* firstFrag, char* secondFrag, int* longestCommonLength, char** suffix, char** prefix, int* relative_pos) {
    *suffix = firstFrag;
    *prefix = secondFrag;
}

Затем необходимо соответствующим образом разыменовать его в вызывающей программе.Веселись!

0 голосов
/ 07 октября 2010

Если вам нужна эта функциональность, вы можете либо передать указатель на копию указателя вызывающей стороны (чтобы вызываемая функция могла использовать ее для обратной записи), либо вы можете просто вернуть указатель, который, как ожидается, будет храниться вызывающей стороной и использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...