2015-03-03 58 views
0

在終端中編譯時,我總是收到錯誤分段錯誤:11.目標是用命令在寄存器圖片上做黑圈。我的推理,如果因爲我的文件IO,它不工作。我沒有在FILE類型中輸入&,而是改變了在pgmUtility中調用的兩個函數,以便在文件中不調用並且程序運行平穩。所以我假設我需要幫助重點關注與我的文件IO有關的問題。分段錯誤:C終端中的錯誤信息

命令用於:

$ ./a.out -c 470 355 100 < balloons.ascii.pgm> TestImages/balloons_c100_4.pgm

它使用涉及pgmUtility.c main.c中程序

這是MAIN.C

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
#include "pgmUtility.h" 

#define ROWS 4 
#define COLS 100 

void usage(void) 
{ 
    printf("Usage\n"); 
    printf(" -h Help Dialog\n"); 
    printf(" -e edgeWidth <OldImageFile> NewImageFile\n"); 
    printf(" -c centerRow centerCol radius <OldImageFile> NewImageFile\n"); 
    printf(" -e edgeWidth -c radius centerRow centerCol <OldImageFile> NewImageFile\n"); 
    exit (8); 

} 


int main(int argc, char * argv[]) { 

    FILE *fp; 
    FILE *out; 
    int i, j; 
    int flag1 = 0; //-e switch (edge draw) 
    int flag2 = 0; //-c switch (circle draw) 
    int numRows, numCols, centerRow, centerCol, radius, edgeWidth; 
    char originalImage[100], newImageFile[100]; 


    char **header = (char**) malloc (sizeof(char*)*4); 
    int **pixels; 


    //command line argument parsing 
    //turn flag switches on or off 

    if(argc < 3) 
     usage(); 
    if(argc > 7) 
     usage(); 

    for(i = 1; i < argc; i++) { 

     if(strncmp(argv[i], "-e", 2) == 0) { 
     //set flag on 
     //get edge with values) 
     if(atoi(argv[i+1]) == 0) { 
      usage(); 
     } 
     edgeWidth = atoi(argv[i+1]); 
     if(argv[i+2] != NULL) { 
      if(atoi(argv[i+2]) != 0) { 
       usage(); 
      } 
     } 
     flag1 = 1; 
     } 
     if(strncmp(argv[i], "-c", 2) == 0) { 
     //set flag on 
     //get radius and center values 
     if(atoi(argv[i+1]) == 0) { 
      usage(); 
     } 
     centerRow = atoi(argv[i+1]); 
     centerCol = atoi(argv[i+2]); 
     radius = atoi(argv[i+3]); 
     flag2 = 1; 
     strcpy(originalImage, argv[5]); 
     strcpy(newImageFile, argv[6]); 
     fp = fopen(originalImage, "r"); 
     out = fopen(newImageFile, "w"); 

     } 
     if(strncmp(argv[i], "-h", 2) == 0) { 
     usage(); 
     } 

    } 

    //allocate memory for header array 
    header = (char **)malloc(ROWS * sizeof(char)); 
    for(i = 0; i < ROWS; i++) { 
     for(j = 0; j < COLS; j++) { 
     header[i] = (char *)malloc(COLS * sizeof(char *)); 
     } 
    } 

    //read pgm file 
    pixels = pgmRead(header, &numRows, &numCols, fp); 
    if(pixels == NULL) 
     usage(); 

    switch(flag1) { 
     case 1 : 
     if(flag2 == 1) { 
     //execute circle draw and edge draw 
      pgmDrawCircle(pixels, numRows, numCols, centerRow, centerCol, radius, header); 
      pgmDrawEdge(pixels, numRows, numCols, edgeWidth, header); 
     } 
     else { 
     //execute only edge draw only 
      pgmDrawEdge(pixels, numRows, numCols, edgeWidth, header); 
     } 
     break; 
     case 0 : 
     if(flag2 == 1) { 
     //execute circle draw 
      pgmDrawCircle(pixels, numRows, numCols, centerRow, centerCol, radius, header); 

     } 
     break; 
     default : 
     usage(); 
     break; 
    } 


    //write new pgm file 
    pgmWrite((const char **)header, (const int **)pixels, numRows, numCols, out); 

    //Garbage Collection 
    //Fix this 
    //free(pixels); 
    //free(header); 

    for(i = 0; i < numRows; i++) { 
     int *current= pixels[i]; 
     free(current); 
    } 
    for(i = 0; i < ROWS; i++) { 
     char *current = header[i]; 
     free(current); 
    } 
    return 0; 

} 

這是pgmUtility.c兩個功能,我認爲可能是問題的原因。

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <string.h> 

#include "pgmUtility.h" 

#define ROWS 4 
#define COLS 100 


// Implement or define each function prototypes listed in pgmUtility.h file. 
// NOTE: You can NOT change the input, output, and argument type of the functions in pgmUtility.h 
// NOTE: You can NOT change the prototype (signature) of any functions listed in pgmUtility.h 

int ** pgmRead(char **header, int *numRows, int *numCols, FILE *in ){ 
    int r, c; 
    int **array; 

    for(r = 0; r < ROWS; r++) { 
    fgets(header[r], COLS, stdin); 
    if(header == NULL) 
     return NULL; 
    } 

    //sscanf parses the numRows and numCols 
    sscanf(header[ROWS - 2], "%d %d", numCols, numRows); 

    //read in pixel map 
    array = (int **)malloc(*numRows * sizeof(int *)); 
    for(r = 0; r < *numRows; r++) { 
    array[r] = (int *)malloc(*numCols * sizeof(int)); 
    } 

    for(r = 0; r < *numRows; r++) { 
    for(c = 0; c < *numCols; c++) { 
     fscanf(in, "%d", *(array + r) + c); 
    } 
    } 
    fclose(in); 
    return array; 

} 


int pgmWrite(const char **header, const int **pixels, int numRows, int numCols, FILE *out){ 


//iterate straight through pixels 
//setup with a loop to insert a new line every "numCols" and keep printing until "numRows + 1" is reached (as soon as numRows + 1 break loop) 
    int i, j; 
    for(i = 0; i < 4; i++){ 
    //printf("%s", *header[i]); 
     fprintf(out, "%c", *header[i]); 

    } 
    //for(i = 0; i < 4; i++) 
      //fprintf(out, "*I=%d**%s**", i, header[i]); 


    for(j = 0; j < numRows; j++){ 
     for(i = 0; i < numCols; i++) 
     fprintf(out, "%d ", pixels[i][j]); 
     fprintf(out, "\n"); 

    } 
    fclose(out); 
    return 0; 



} 
+0

使用調試器來確定分割錯誤發生在哪裏,然後重新發布問題。並且請格式化您的代碼,假裝有人會閱讀您的代碼是無禮的。 – 2015-03-03 02:23:44

+0

僅供參考:[不要鑄造malloc](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – Barmar 2015-03-03 02:23:56

+0

@iharob我試着用命令lldb進行調試,但它退出&不讓我寫命令。 – user3040301 2015-03-03 02:29:33

回答

3

你無法正確分配header陣列。它應該是:

header = malloc(ROWS * sizeof(char*)); 
for(i = 0; i < ROWS; i++) { 
    header[i] = malloc(COLS * sizeof(char)); 
} 

您在兩個sizeof調用中有錯誤的類型。

你根本不需要內部的j循環,你反覆分配到相同的header[i]

而對於C(而不是C++)看到:Do I cast the result of malloc?

而且,在main()一開始你有一個額外的分配,你永遠不會使用或免費:

char **header = (char**) malloc (sizeof(char*)*4); 

你應該擺脫這個。

它不相關的錯誤,但這是錯誤的:

if(header == NULL) 
    return NULL; 

您應該測試header[r]

爲清楚起見,我建議重寫:

fscanf(in, "%d", *(array + r) + c); 

爲:

fscanf(in, "%d", &array[r][c]); 
+0

查看答案,我想知道,你需要多少次分配每個'header [i]'? – 2015-03-03 04:39:43

+0

完美 - 一直髮生在我身上;-) – 2015-03-03 04:44:11

1

看起來(甚至糾正malloc呼叫作爲正確建議後),你是分配header[i]COLS次數。

header = malloc(ROWS * sizeof(char*)); 
for(i = 0; i < ROWS; i++) { 
    for(j = 0; j < COLS; j++) { 
    header[i] = malloc(COLS * sizeof(char)); // this happens COLS times 
    } 
} 

,這將會使COLS數量分配每個header[i]的。在我讀取您的代碼時,您只需爲每個header[i]分配一個字符數組。要做到這一點,你需要移動header[i] = malloc(COLS * sizeof(char));for(j = 0; j < COLS; j++)外循環:

header = malloc(ROWS * sizeof(char*)); 
for(i = 0; i < ROWS; i++) { 
    header[i] = malloc(COLS * sizeof(char)); 
} 

您也應該驗證header每個header[i]成功分配。