2016-08-12 2 views
-3

Это мой код:Invalid свободный()/удалить/удалить []/перераспределить()

#include <stdlib.h> 
#include <stdio.h> 
#include <stdbool.h> 

int main() { 

    setvbuf(stdout, NULL, _IONBF, 0); 
    setvbuf(stderr, NULL, _IONBF, 0); 

    int i=0; 
    int j=0; 
    int x=1; 
    int *numOfPhases=&x; 
    char** nameOfPhases=malloc((*numOfPhases)*sizeof(*nameOfPhases)); 
    char* stTemp; 
    //TODO: check if NULL 
    for (i=0; i<(*numOfPhases);i++) { 
     nameOfPhases[i]=malloc(sizeof(char)); 
     char *st=nameOfPhases[i]; 
     printf("enter char\n"); 
     do { 
      stTemp=malloc(st,sizeof(char)*(j+1)); 
      //TODO: check if NULL 
      st[j]=getchar(); 
      j++; 
     } while (st[j]!='\n'); 
     if (j>=1) { 
      st[j-1]='\0'; 
     } 
     st[j]=0; 
     printf("%s \n", nameOfPhases[i]); 
     j=0; 
    } 

    for (i=0;i<(*numOfPhases);i++) { 
     printf("%s ", nameOfPhases[i]); 
    } 

    for (i=0;i<(*numOfPhases);i++) { 
     free(nameOfPhases[i]); 
    } 

    free(nameOfPhases); 
    return 0; 
} 

Когда я бегу это на Windows, все работает просто отлично. Однако, когда я бегу это на Unix с помощью valgrind я сталкиваюсь несколько ошибок, таких как:

==10215== Invalid read of size 1 
==10215== at 0x343F047E2C: vfprintf (in /lib64/libc-2.12.so) 
==10215== by 0x343F0495DF: buffered_vfprintf (in /lib64/libc-2.12.so) 
==10215== by 0x343F04421D: vfprintf (in /lib64/libc-2.12.so) 
==10215== by 0x343F04F189: printf (in /lib64/libc-2.12.so) 
==10215== by 0x400837: main 
==10215== Address 0x4c23090 is 0 bytes inside a block of size 1 free'd 
==10215== at 0x4A06C20: realloc (vg_replace_malloc.c:662) 
==10215== by 0x4007CC: main 
==10215== 
==10215== Invalid free()/delete/delete[]/realloc() 
==10215== at 0x4A06430: free (vg_replace_malloc.c:446) 
==10215== by 0x4008AF: main 
==10215== Address 0x4c23090 is 0 bytes inside a block of size 1 free'd 
==10215== at 0x4A06C20: realloc (vg_replace_malloc.c:662) 
==10215== by 0x4007CC: main 
==10215== 
==10215== 
==10215== HEAP SUMMARY: 
==10215==  in use at exit: 1 bytes in 1 blocks 
==10215== total heap usage: 5 allocs, 5 frees, 12 bytes allocated 
==10215== 
==10215== 1 bytes in 1 blocks are definitely lost in loss record 1 of 1 
==10215== at 0x4A06C20: realloc (vg_replace_malloc.c:662) 
==10215== by 0x4007CC: main (in /homet2/ayeletk/OG/main.exe) 
==10215== 
==10215== LEAK SUMMARY: 
==10215== definitely lost: 1 bytes in 1 blocks 
==10215== indirectly lost: 0 bytes in 0 blocks 
==10215==  possibly lost: 0 bytes in 0 blocks 
==10215== still reachable: 0 bytes in 0 blocks 
==10215==   suppressed: 0 bytes in 0 blocks 
==10215== 
==10215== For counts of detected and suppressed errors, rerun with: -v 
==10215== ERROR SUMMARY: 4 errors from 3 contexts (suppressed: 6 from 6) 

Кто-нибудь есть какие-либо идеи, почему это могло произойти?

+8

ваши распределения все неправильно. Чудо работает на окнах. Во-первых, 'int x = 1; int * numOfPhases = & x; 'какая польза? то ... ну, вы должны переписать свой код, у вас есть утечки памяти/слишком короткие выделения. Вы читали предупреждения компиляции?Еще один: 'stTemp = malloc (st, sizeof (char) * (j + 1));' и вы никогда не будете использовать 'stTemp' снова –

+0

Я бы порекомендовал вам прочитать [link: C Programming Language book] (https : //hassanolity.files.wordpress.com/2013/11/the_c_programming_language_2.pdf). Научитесь правильно распределять память –

+0

Вы только malloc одиночный 'char' для' nameOfPhases [i] '. Вы malloc массив 'char' для' stTemp', но никогда не используете его или не освобождаете. 'st' указывает на один и тот же символ' char' как 'nameOfPhases [i]', а обращения к 'st [j]' недопустимы, когда 'j'> 0. –

ответ

0

вот некоторые, но не все проблемы в коде:

  1. «numOfPhases никогда не изменяется после инициализации и всегда указывает на» x'so можно упростить, если всегда использовать „х“ вместо '*' numOfPhases

  2. , когда вышеуказанная проблема включена, то можно устранить переменную '' numOfPhases

  3. 'SizeOf (Char)' определен в стандарте как 1, для использования ясности 1

  4. ничего Опубликованная кода не использует «ложь», ни «правда», ни «BOOL», поэтому оператор #include <stdbool.h> следует удалить

  5. ни один из операторов вывода не хватает символа «\ п» так заявления setvbuf(stdout, NULL, _IONBF, 0); и setvbuf(stderr, NULL, _IONBF, 0); не действуют, кроме как загромождать код

  6. переменная 'x' инициализируется 1, а затем не изменяется. предложил использовать «#define», а не переменную

  7. это утверждение является недействительным как «таНос()» имеет только один параметр stTemp=malloc(st,sizeof(char)*(j+1));

  8. массив «й []» не определено в посланной чтобы любые ссылки на «st» заставили компилятор выводить сообщение об ошибке

  9. для удобства чтения и понимания кода, отдельных блоков кода (для, если, еще, в то время как, делать ... пока, переключатель, корпус, по умолчанию) через пустую строку

  10. умножение значение у на 1, не имеет никакого значения, и только загромождает код, так что не умножая на sizeof(char)

есть много других проблем в коде, но это должно вам начать работу в правильном направлении.

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

для '' НКУ, при минимальном использовании: -Wall -Wextra -pedantic

Я также использую: -Wconversion -std=gnu99

Смежные вопросы