尝试将函数返回的无符号值分配给指向无符号的指针时,继续获取 SIGSEGV

Keep getting SIGSEGV when trying to assign a function returned unsigned value to a pointer to unsigned

我目前正在使用 lodepng 处理一个项目。然而,当我试图将 PNG 文件解码为像素时,出现了神秘的段错误。

根据我使用gdb得到的信息:

Program received signal SIGSEGV, Segmentation fault.                                                            
0x000055555555fd05 in lodepng_inspect (w=0x0, h=0x4, state=0x7fffffffd8b8, in=0x7ffff7eac010 "1PNG\r\n2\n", insize=993556)
    at util/lodepng/lodepng.cpp:3937
3937      *w = lodepng_read32bitInt(&in[16]);

然后我阅读了 lodepng.cpp:3937 的代码,因此用一个简短的 c++ 程序重现了这个现象:

#include<iostream>
#include"lodepng.cpp"

using namespace std;

int main(){
    const unsigned char c[] = {0x12,0x34,0x56,0x78};
    unsigned *w=NULL;
    *w=lodepng_read32bitInt(c);
    cout << *w << endl;
    return 0;
}

由于lodepng_read32bitInt (find source here) 没有在头文件中声明,我必须包含cpp文件。

通过运行它,我在gdb中得到了类似的错误:

Program received signal SIGSEGV, Segmentation fault.
0x00005555555688bd in main () at poc.cc:9
9               *w=lodepng_read32bitInt(c);

所以有人知道如何解决这个问题吗?

作为lodepng_read32bitInt returns unsigned

将代码更改为

unsigned w = lodepng_read32bitInt(c);
cout << w << endl;

编辑 来自link的代码是

unsigned lodepng_read32bitInt(const unsigned char* buffer)
{
  return (unsigned)((buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]);
}

在以下:

unsigned *w=NULL;
*w=lodepng_read32bitInt(c);

您正在尝试为 nnull 指针指向的内容赋值,这是一个无符号的,只是将其设为您的变量类型,而不是将其设为指针。总是

unsigned w =lodepng_read32bitInt(c);going to fail in user-mode code. If the function returns 一个