C语言 为什么printf在运行png_read_png函数后不打印?

wwwo4jvm  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(149)

平台=Win10 x64编译器=愚者语言=C库=libpng16.dll
我尝试使用libpng库,但是printf在下面这行之后什么也不输出:

png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);

完整代码:

#include <stdio.h>
#include <png.h>

int main(int argc, char* argv[])
{
  printf("starting...\n");
  
  FILE *fp = fopen("test.png", "rb");
  if (!fp) {
    printf("error #%d\n", 1);
  }  

  // Read the PNG header
  png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
  if (!png_ptr) {
    printf("error #%d\n", 2);
  }

  // create stuct for png info/meta data
  png_infop info_ptr = png_create_info_struct(png_ptr);
  
  if (!info_ptr) {
    printf("error #%d\n", 3);
  }

  if (setjmp(png_jmpbuf(png_ptr))) {
    printf("error #%d\n", 4);
  }    

  png_init_io(png_ptr, fp);

  // Read the PNG image data
  printf("before printf dies\n");
  png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
  printf("this will not print after png_read_png is ran\n");
  fflush(stdout);

/* it won't print regardless if the below cleanup code is commented out or not */

  // Get the image dimensions and bit depth
  png_uint_32 width, height;
  int bit_depth, color_type;
  png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL);

  // Allocate memory for the image data
  png_bytep *row_pointers = png_malloc(png_ptr, height * sizeof(png_bytep));
  for (png_uint_32 i = 0; i < height; i++)
  {
      row_pointers[i] = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
  }

  // Read the image data into memory
  png_read_image(png_ptr, row_pointers);

  // Clean up
  png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
  
  // Free the memory allocated for the image data
  for (png_uint_32 i = 0; i < height; i++)
  {
      png_free(png_ptr, row_pointers[i]);
  }
  png_free(png_ptr, row_pointers);
/**/

  fclose(fp);
  
    return 0;
}

它将输出以下内容:

starting...
before printf dies

很抱歉有个新手问题。但是我找不到任何关于这个的信息。只有一堆帖子说要用换行符结束printf,但是我正在这样做。提前感谢你的帮助!

kt06eoxx

kt06eoxx1#

为什么你的代码看起来像是被锁住了,没有进展,原因是你误解了setjmp()返回的内容。你似乎认为它返回0表示成功,而!0表示“错误”。
这是不正确的。当你实际调用setjmp()时,它返回0,当其他代码调用longjmp()并返回到那里时,它返回!0。
png_read_image()似乎(出于某种原因)调用jongjmp()来发出错误信号,所以你的代码进入了一个无限循环。
所有的错误测试都不应该只是记录错误然后继续运行程序,它们应该exit()或者return。
显然还有其他一些问题(为什么png_read_image()失败),但这就是当前问题(代码锁定)的原因。

相关问题