Указатель меняет значение без причины C ++ - PullRequest
1 голос
/ 11 декабря 2010

Я пытаюсь сохранить указатель в качестве переменной-члена, чтобы в течение жизни класса другие функции могли работать с указателем.

Однако, когда я впервые настраиваю этот класс, переменная-указательверно для первого printf, но когда вызывается второй, значение равно 0x0

В моем основном случае setup вызывается сначала один раз, а затем вызывается update неоднократно.

переменные-членыобъявлены в файле h.

почему указатель меняется между первым и вторым printf?

// Main //

int Main(){

TestClass testclass;

unsigned char array[1000];
unsigned char * pVideoIn = array;

testclass.setup(pVideoIn);

for (int i =0; i < 100; i++)
    {
    testclass.update();
    }
}

// header //

#ifndef _TEST_CLASS
#define _TEST_CLASS

class TestClass {

public:
void setup(unsigned char* videoIn); 
void update();

unsigned char* videoInp;
unsigned char* videoOutp;

int noPixels; 
};

#endif

// класс //

#include "TestClass.h"

void TestClass::setup(unsigned char* videoIn)
{
videoInp = videoIn;
videoOutp = videoOut;
noPixels = pixels;

printf("in class app = %p \n", videoInp);

}

void TestClass::update()
{ 
printf("in class app = %p \n", videoInp); 
}

Ответы [ 2 ]

3 голосов
/ 21 августа 2011

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

В основном: будьте осторожны с массивами.Я забыл об этом, так как программирование для Java и C # сделало меня немного ленивым: вы не получаете исключение IndexOutOfBoundsException в c ++, программа просто переходит в любую область памяти, в которую вы ей указываете, и соответствующим образом модифицирует ее.Если вам повезет, вы сразу же получите ошибку Access Violation, когда программа попытается записать в местоположение, которое находится за пределами того, что выделено для него ОС.Если вам не повезет, он изменит часть памяти, которая принадлежит ему, испортит любые объявленные вами указатели, переменные или объекты.

3 голосов
/ 11 декабря 2010

Как написано, и после исправления незначительных ошибок компиляции (например, путем предоставления NULL и 0 в качестве других аргументов для установки), представленный код не демонстрирует поведение, которое вы описываете, когда я его запускаю.В частности, он выводит один и тот же ненулевой указатель 101 раз.Вывод: это не тот код, с которым у вас возникли проблемы (вам нужно опубликовать пример, который действительно показывает проблему).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...