2015-01-29 1 views
0

방금 ​​C 프로그래밍을 배우고 동적 배열 및 malloc 및 realloc을 연습하기 시작했습니다. 나는 Visual Studio를 사용하고 있으며 코드는 파일 확장자가 .c입니다. 하지만 왜 realloc이 오류 메시지를 일으키는 지 알지 못합니다. "HEAP [Assignment1Start.exe] : 01217FE8에서 힙 블록이 요청한 크기 인" "realloc을 원합니다"라는 문구를 Ctrl-f로 누르십시오. 오류 메시지의 원인이되는 행으로 안내합니다.C 언어 동적 배열 realloc으로 인해 힙 블록 오류 메시지가 발생합니다.

#define _CRT_SECURE_NO_DEPRECATE 
    #include<stdio.h> 
    #define _CRT_SECURE_NO_WARNINGS 

    #define _NO_DEBUG_HEAP 1 

    int main() 
    { 
     FILE *ptr_file; 
     FILE *ptr_file2; 
     char buf[1000]; //1000 characters array. //if label[10] = "Single"; then label[2] outputs "n"// label[6] outputs "\0" // label[7] outputs " " empty space 

     char *vArray2; //is as pointer to a character, to which you allocated memory to hold exactly 1 character. 
     int NoOfTasks = 0; 
     char **ArrayNo; 
     char **ArrayTemp; 
     //#define ArrayCapacity 15 
     int ArrayCapacity = 20; 
     #define ID_LEN 10 
     int i; 
     int power = 1; 
     int quitbtn = 8; 


     ptr_file = fopen("output.txt", "r"); 
     if (!ptr_file) 
      return 1; 

     ArrayNo = (char*)malloc(ArrayCapacity*sizeof(char)); //allocate some memory that your pointer will point to. //You should always make it point to something or you can allocate some memory that your pointer will point to. 

     ArrayNo[NoOfTasks] = malloc((ID_LEN + 1) * sizeof(char)); 
     strcpy(ArrayNo[NoOfTasks], "Quit\n"); 
     NoOfTasks += 1; 

     while (fgets(buf, 1000, ptr_file) != NULL) //fgets adds the \n to the end of each line it reads and stores it in buf //outputs to command prompt//If the end-of-file (EOF) is reached the fgets function will return a NULL value 
     { 

      ArrayNo[NoOfTasks] = malloc((ID_LEN + 1) * sizeof(char)); 
      strcpy(ArrayNo[NoOfTasks], buf); 

      NoOfTasks += 1; 
     } 

     while (power == 1){ 

      for (int r = 0; r < NoOfTasks; r++){ 

        printf("%d %s", r,ArrayNo[r]); 

      } 

      printf("\n Please enter the task order number"); 

      int userInputInt1 = 0; 

      scanf("%d", &userInputInt1); 

      if (userInputInt1 != 0) //0 is quit NoOfTasks-1 
      { 
       printf("\n %s (1)Add task (2) Remove Task (3)Replace Task", ArrayNo[userInputInt1]); 
       int userInputInt2 = 0; 
       scanf("%d", &userInputInt2); 
       //int result = atoi(userInput2); // convert string to int 

       if (userInputInt2 == 3) 
       { 
        printf("\n Type in new task"); 
        char userInput3[30]; 
        scanf("%s", &userInput3); 

        if (userInput3 != " "){ 

         int n; 

         printf("\n %s Replaced with %s \n", ArrayNo[userInputInt1], &userInput3); 

         strcpy(ArrayNo[userInputInt1], &userInput3); 
         strcat(ArrayNo[userInputInt1], "\n"); 
        } 
       } 
       if (userInputInt2 == 2) //remove 
       { 
        int n; 
        NoOfTasks -= 1; 
        for (int c = userInputInt1; c < NoOfTasks; c++){ 
         printf("\n %s Replaced with %s", ArrayNo[userInputInt1], ArrayNo[c + 1]); 
         ArrayNo[c] = ArrayNo[c + 1]; 
        } 
       } 
       if (userInputInt2 == 1) //add 
       { 
        printf("\n Add a task"); 
        char userInput4[30]; 
        scanf("%s", &userInput4); 


        ArrayCapacity += 1;// increase ArrayCapacity by 1 because a new task is added 
        ArrayNo = (char**)realloc(ArrayNo, (ArrayCapacity* sizeof(char*))); // here I want to realloc memory for new element of the array ArrayNo when a new task is added 
        ArrayNo[NoOfTasks] = malloc((ID_LEN + 1) * sizeof(char)); 
        strcpy(ArrayNo[NoOfTasks], &userInput4); 

        NoOfTasks += 1; 
       } 

      } 
      if (userInputInt1 == 0) //8 is quit NoOfTasks-1 
      { 
       ptr_file2 = fopen("WriteTo2.txt", "w"); 
       if (!ptr_file2) 
        return 1; 
       for (int r = 1; r < NoOfTasks; r++){ 

        fprintf(ptr_file2, "%s\n", ArrayNo[r]); 
       } 
       printf("\n You quit the program"); 
       fclose(ptr_file2); 
       fclose(ptr_file); 
       power = 0; 
      } 
     } 


     getchar(); 
     getchar(); 
     getchar(); 
     return 0; 
    } 
+0

ArrayNo = (char *) malloc (ArrayCapacity * sizeof (char));'ArrayNo = (char **) malloc (ArrayCapacity * sizeof (char *)); ' – BLUEPIXY

+0

'userInput3! = " "'->'strcmp (userInput3," ")! = 0' – BLUEPIXY

답변

0

초기 할당이 잘못되었습니다.

ArrayNochar**입니다. 그리고 당신은이 만 ArrayCapacity 바이트 (sizeof(char)은 1) 할당

ArrayNo = (char*)malloc(ArrayCapacity*sizeof(char)); 

을한다. 그리고 실제로 배열은 ArrayCapacity*4 또는 ArrayCapacity*8 바이트 (sizeof(char*)은 4 또는 8입니다.)라고 가정하면 ArrayNo [5]는 이미 할당 된 영역을 벗어난 오프셋 4 * 5에서 시작합니다. 따라서 배열을 채울 때 허용되지 않는 메모리의 일부 바이트를 덮어 쓰며 운좋게도 realloc (디버그 모드에서)에 대한 검사가 있고 메모리 손상이 발생하는 즉시 실행이 중지됩니다.

+0

답장을 보내 주셔서 감사합니다. 이 문제를 어떻게 해결하라고 조언 해 주시겠습니까? – SpiderWeb

+0

'ArrayNo = (char **) malloc (ArrayCapacity * sizeof (char *));'(두 occurences'char' 근처에 여분의'*'가 있음을주의하십시오)은 충분한 메모리를 할당합니다. – Inspired