Динамическое распределение памяти с использованием временного массива

У меня возникают проблемы с динамическим распределением памяти для массива. Программа просто должна обменивать своп первый ряд со вторым, а третий с четвертым. Я получаю странные результаты, такие как:

Введите строку: привет

Введите строку: как вы

Введите строку: я очень благодарен

Введите строку: bye

Введите строку: bai

Введите строку: xx

=========================

как дела

!я хорошо, спасибо

Здравствуйте

!как дела

пока

! баи

я хорошо, спасибо

!пока

бай

! хх

int count = 0;
 char *lines[MAX_LINES];
 char *tmp[50]; 


 printf("Enter string: ");
 fgets(tmp, 50, stdin);
 lines[count] = (char *) malloc((strlen(tmp)+1) * sizeof(char));
 strcpy(lines[count], tmp); 

 while(strcmp("xx\n", lines[count])){
 count++;
 printf("Enter string: ");
 fgets(tmp, 50, stdin); 
 lines[count] = (char *) malloc((strlen(tmp)+1)* sizeof(char));

 strcpy(lines[count], tmp); 
 }

void exchange(char * records[])
{
 char * temp;
 temp = records[0];
 records[0] = records[1];
 records[1] = temp;

 temp = records[2];
 records[2] = records[3];
 records[3] = temp; 

}

void printArray(char * inputs[], int row, int col)
{
 int i, j;

 for(i = 0; i < row; i++){
 for(j = 0; j < col; j++){
 printf("%c", inputs[i][j]);
 }

 }
}
1 ответ

Это не хорошо:

char *tmp[50];

Вы намеревались сделать это:

char tmp[50];

Как ни странно, это будет работать, но ваш компилятор должен был вскрывать предупреждения повсюду.

Я думаю, что ваша главная проблема - ваша функция printArray, которая не проверяет терминатор NULL в строке. Таким образом, он будет работать сразу же после окончания большинства из них.

Вместо печати по-характеру выполните следующее:

void printArray(char * inputs[], int length)
{
 int i;
 for(i = 0; i < length; i++){
 printf("%s", inputs[i]);
 }
}

Вот совет по использованию malloc. Не произносите результат, и если вы зарезервируете место для значений char, не используйте sizeof(char) - он всегда 1.

lines[count] = malloc( strlen(tmp) + 1 );

licensed under cc by-sa 3.0 with attribution.