Условный переход или перемещение зависит от неинициализированных значений, но я думаю, что я делаю - PullRequest
0 голосов
/ 25 сентября 2019

Я исправляю программу, которая должна правильно озаглавить каждое слово в строке, ввод задается как struct pair, который определен как:

// A struct to record pairs of strings
typedef struct pair {
    char *first;  // the input string
    char *second;  // the result string
} pair;

, и вот моя фиксированная версия метода:

void process(pair work) {

    int len = strlen(work.first);
    char *temp = malloc(len * sizeof(work.first));  // LINE 22 IS HERE

    // convert all words to lowercase
    for (int i = 0; i < len; i++) {
        char c = work.first[i];
        if (isupper(c)) {
            temp[i] = tolower(c);
        } else {
            temp[i] = c;
        }
    }

    // title each word
    int last_space = 1;
    for (int i = 0; i < len; i++) {
        if (last_space && isalpha(temp[i])) {
            temp[i] = toupper(temp[i]);
        }
        last_space = temp[i] == ' ';
    }

    strcpy(work.second, temp);   // LINE 44 IS HERE
    free(temp);
}

Когда я запускаю $ valgrind --track-origins=yes ./fixed hello, я получаю:

==25973== Memcheck, a memory error detector
==25973== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==25973== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==25973== Command: ./fixed hello
==25973== 
==25973== Conditional jump or move depends on uninitialised value(s)
==25973==    at 0x4C2BADB: strcpy (vg_replace_strmem.c:506)
==25973==    by 0x400985: process (fixed.c:44)
==25973==    by 0x400A13: main (fixed.c:59)
==25973==  Uninitialised value was created by a heap allocation
==25973==    at 0x4C28BE3: malloc (vg_replace_malloc.c:299)
==25973==    by 0x400856: process (fixed.c:22)
==25973==    by 0x400A13: main (fixed.c:59)
==25973== 

...(other stuff which seems unrelated)

==25973== For counts of detected and suppressed errors, rerun with: -v
==25973== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

Я не понимаю, почему это происходит, у меня, кажется, есть какой-то другой ответ, что эта ошибка обычно происходит из-за того, что я неправильно инициализировать мою переменную, но я назначил свою переменную в вопросе temp в цикле.

обновление: моя работа инициализирована и выделена память здесь:

int main(int argc, char **argv) {
    pair work;
    work.first = argv[1];
    work.second = malloc(strlen(work.first) * sizeof(work.first));
    if (!work.second) {
        fprintf(stderr, "Failed to allocate memory");
        exit(-1);
    }

    process(work);

    printf("%s becomes %s\n", work.first, work.second);
    free(work.second);

    return 0;
}
...