Как исправить предупреждение C4700 в C ++ с помощью неинициализированных указателей?

Я прочитал многие из предыдущих постов на C4700, но не могу найти решение своей проблемы.

У меня есть небольшой сценарий, написанный для демонстрации указателей структуры:

struct foo
{
int * bar;
};

#include<iostream>
using namespace std;
int main()
{
foo * fooptr;
int * num;
*num = 25;
*fooptr->bar = *num;
cout << "now fooptr points to a foo struct whose bar points to: " << *fooptr->bar;

fooptr->bar = num;
cout <<"now fooptr's struct's bar shares memory address with num at " <<num;

return 0;
}

Когда я его компилирую, я получаю два предупреждения C4700 о неинициализированных локальных переменных num и fooptr.
Я пошел дальше и инициализировал оба значения NULL, поэтому ошибка компилятора исчезла, но неудивительно, что я получил исключение:

Необработанное исключение в 0x00265DF7 в testing.exe: 0xC0000005: расположение записи нарушения прав доступа 0x00000000.

Вы видите, я всегда думал, что когда я не инициализирую эти указатели, они будут автоматически инициализироваться со случайными адресами (точно так же, как неинициализированным ints / chars / doubles будут назначаться garbages) — так не должно ли это быть здесь?

Если инициализация в этом случае действительно необходима (почему?), То есть ли легкий способ обойти эту проблему?

0

Решение

Неинициализированные переменные не инициализируются случайными значениями, они неинициализированы. На уровне машинного кода они имеют какое-либо значение при создании. Это может быть или не быть адрес реального объекта. В любом случае, это попытка получить доступ к значению неинициализированного указателя, как будто есть объект по этому адресу.

Итак, ваш компилятор делает вам одолжение, выдавая предупреждение (это не обязательно делать), потому что ваш код имеет неопределенное поведение.

тогда есть ли простой способ обойти эту проблему?

Установите указатели так, чтобы они указывали на действительные объекты, прежде чем разыменовывать их. Если вы этого не сделаете, то нет никаких обещаний о том, как будет вести себя ваша программа.

2

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

Вместо

int *num; // num points to somewhere random
*num = 25; // writing somewhere random makes zero sense
// and if your OS allowed you to do it, you would
// crash your computer very often.

ты должен написать

int num = 25;
int *pnum = &num; // pnum is a pointer to int which has been
// initialized with the address of num

И то же самое относится structсодержание.

2

C4700 не является ошибкой. DOT. Но MSVC не удается скомпилировать на C4700, что является ошибкой, поскольку по умолчанию включен переключатель компилятора «/ sdl»
C4700 discution на сайте visualstudio ,
Коммутатор MSDN / SDL для версии 2012+

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