Хорошо, я приложил много усилий, рассмотрел здесь много вопросов, но я не могу дойти до сути этого. Надеюсь, вы можете пролить свет на мою проблему здесь!malloc() повторное использование местоположения памяти после free(), вызывающее фрагментацию (?)
int main(int argc, char *argv[]){
char read[50];
char *string[10];
while(1){
fgets(read,sizeof read, stdin);
int t = 0; //ticks whenever a non-whitespace char is read
int pos = 0; //keeps track of position in string array
int i;
int j;
for(i = 0; i < sizeof read; i++){
if(isspace(read[i]) && t != 0){
string[pos] = malloc((t+1) * (sizeof(char)));
// int z;
// for(z = 0; z < sizeof string[pos]; z++){
// string[pos][z] = '\0';
// }
for(j = 0; j < t; j++){
string[pos][j] = read[i-(t-j)];
}
t = 0;
pos++;
}
else if(!isspace(input[i])) t++;
}
int k;
for(k = 0; k < pos; k++){
printf("%i: %s\n",k,string[k]);
free(string[k]);
}
}
}
Я пытаюсь написать программу, которая будет читать в предложении от пользователя, который затем распался на составляющие его слова, каждый из которых хранится в его собственном массив символов.
Я использую malloc() для выделения достаточного количества памяти для каждого слова, освобождая его после использования.
Первый прогон в порядке, но после последующих циклов слова короче 5 символов (и только если набрано более одного слова, разделенное пробелом) не будет отображаться правильно, со случайными дополнительными символами/символами, добавленными к ним ,
Возможно, это связано с тем, что malloc использует свободную память, которая не пуста? Если это так, как я должен правильно использовать malloc?
Единственный способ исправить это - использовать код, который я прокомментировал. Он заполняет вновь выделенный массив символов с помощью \ 0.
Спасибо!
пример вывода:
input words(0): we we we
0: we
1: we
2: we
input words(1): we we we
0: we�
1: we�
2: we
является calloc не полезной функцией здесь? http://stackoverflow.com/questions/1538420/difference-between-malloc-and-calloc –
Да, 'malloc' попытается повторно использовать как можно больше памяти для удобства кэширования. – o11c
Кажется, calloc() мог бы быть полезен, если бы я не заполнил весь массив сразу - в моем случае, обнуление последнего байта, похоже, решило мою проблему! – Hal