Продолжайте получать SIGSEGV при попытке присвоить функции, возвращенной без знака, указатель на без знака

В настоящее время я имею дело с проектом, использующим lodepng. Однако при попытке декодировать файлы PNG в пиксели возникает таинственный сбой сегмента.

Согласно информации, которую я получил с помощью GDB:

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

Затем я читаю код на lodepng.cpp: 3937 и поэтому воспроизвел это явление с помощью короткой программы на С ++:

#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 (найти источник Вот) не указано в заголовочном файле, я должен включить файл cpp.

Запустив его, я получил похожую ошибку в GDB:

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

Так у кого-нибудь есть идеи, чтобы решить эту проблему?

-3

Решение

В следующих:

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

Вы пытаетесь присвоить значение тому, на что указывает нулевой указатель, это беззнаковое значение, просто сделайте так, чтобы ваш тип переменной вместо того, чтобы указатель был указателем. всегда

unsigned w =lodepng_read32bitInt(c);going to fail in user-mode code. If the function возвращает

2

Другие решения

Как lodepng_read32bitInt возвращается unsigned

Измените код на

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

РЕДАКТИРОВАТЬ Код по ссылке

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

По вопросам рекламы [email protected]