제목에서 알 수 있듯이,이 오류가 발생하는 곳에서 pset4를 수행하려고합니다. 프로그램을 실행하려고합니다. 포럼과 Reddit을 검색 한 결과 malloc ()에 문제가 있음을 이해했습니다. 이러한 유형의 오류가 발생하면 내 포인터에 충분한 메모리를 할당합니다. 이 질문에 대한 답변을 받았거나 너무 어리석은 경우 죄송합니다.하지만이 오류가 연속 5 일 동안 멈춰 있습니다. 여기에 내 코드가 있으며 누군가가 나를 볼 수 있다면 기쁠 것입니다. 시간 내 주셔서 감사합니다.

 // Copies a BMP file #include <stdio.h> #include <stdlib.h> #include "bmp.h" int main(int argc, char *argv[]) { // ensure proper usage if (argc != 4) { fprintf(stderr, "Usage: copy infile outfile\n"); return 1; } // remember filenames int n = atoi(argv[1]); char *infile = argv[2]; char *outfile = argv[3]; // check if n is correct if (n < 0 || n > 100) { fprintf(stderr, "n must be a positive integer less than or equal to 100\n"); return 1; } // open input file FILE *inptr = fopen(infile, "r"); if (inptr == NULL) { fprintf(stderr, "Could not open %s.\n", infile); return 1; } // open output file FILE *outptr = fopen(outfile, "w"); if (outptr == NULL) { fclose(inptr); fprintf(stderr, "Could not create %s.\n", outfile); return 1; } // read infile"s BITMAPFILEHEADER BITMAPFILEHEADER bf; fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr); // read infile"s BITMAPINFOHEADER BITMAPINFOHEADER bi; fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr); // ensure infile is (likely) a 24-bit uncompressed BMP 4.0 if (bf.bfType != 0x4d42 || bf.bfOffBits != 54 || bi.biSize != 40 || bi.biBitCount != 24 || bi.biCompression != 0) { fclose(outptr); fclose(inptr); fprintf(stderr, "Unsupported file format.\n"); return 2; } // determine padding for scanlines int infilePadding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4; // update output file"s header info while keeping the old one int infileBiWidth = bi.biWidth; int infileBiHeight = bi.biHeight; bi.biWidth *= n; bi.biHeight *= n; // use malloc for creating memory to store pixels of outfile RGBTRIPLE* ppixel = malloc(sizeof(RGBTRIPLE) * bi.biWidth); // create a variable for keeping track of ppixelIndex int ppixelIndex = 0; // calculate padding bytes for output file int outfilePadding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4; // recalculate header info bi.biSizeImage = ((sizeof(RGBTRIPLE) * bi.biWidth) + outfilePadding) * abs (bi.biHeight); bf.bfSize = bi.biSizeImage + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); // write outfile"s BITMAPFILEHEADER fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr); // write outfile"s BITMAPINFOHEADER fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr); // iterate over infile"s scanlines for (int i = 0; i < abs(infileBiHeight); i++) { // iterate over pixels in scanline for (int j = 0; j < infileBiWidth; j++) { // temporary storage RGBTRIPLE triple; // read RGB triple from infile fread(&triple, sizeof(RGBTRIPLE), 1, inptr); // store each pixel n times to ppixel for (int l = 0; l < n; l++) { ppixel[ppixelIndex] = triple; ppixelIndex++; } } // for each pixel write it n times for (int m = 0; m < n; m++) { for (int p = 0; p < n; p++) { // write RGB triple to outfile fwrite(&ppixel[p], sizeof(RGBTRIPLE), 1, outptr); } // write outfile"s padding for (int k = 0; k < outfilePadding; k++) { fputc(0x00, outptr); } } // skip over infilePadding, if any fseek(inptr, infilePadding, SEEK_CUR); } // close infile fclose(inptr); // close outfile fclose(outptr); // free ppixel free (ppixel); // success return 0; } 

댓글

  • @ 감사합니다. 형식을 도와 준 MARS입니다. 제 첫 게시물이었습니다. 죄송합니다 …

답변

답을 찾은 것 같습니다. 주된 문제는 for 루프에서 ppixelIndex 변수를 설정하고 너무 많이 증분한다는 것이 었습니다. 첫 번째 행이 완료되면 재설정하지 않았으므로 두 번째 반복 중에 할당되지 않은 메모리에 도달하려고했습니다. 또한 코드를 약간 수정했지만 주요 솔루션은 ppixelIndex 변수를 루프 내부에 추가합니다. 이 솔루션이 누군가에게 도움이되기를 바랍니다. 🙂

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다