Я исправляю программу, которая должна правильно озаглавить каждое слово в строке, ввод задается как 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;
}