dll and C++ некорректный результат

Рейтинг: 2Ответов: 1Опубликовано: 06.04.2011

Начинаю изучать, что такое dll и с чем его едят. В vs2008 написал пробную dll - посмотреть, как работать с массивами. В итоге при использовании dll-ки получается абракадабра...

Вот код dll:

//mydll.h
extern "C" __declspec(dllexport) int* sum();

//mydll.cpp
#include "stdafx.h"
#include "mydll.h"

using namespace std;
int* sum()
{
    int s[5];
    for(int i=0;i<5;i++)
        s[i]=i;


    return s;
}

Дальше код, где подключается dll:

//mydllapp
#include "stdafx.h"
#include "windows.h"
#include <iostream>

using namespace std;

typedef int* (*P_Sum)();

int _tmain(int argc, _TCHAR* argv[])
{
    HINSTANCE hSimplex = ::LoadLibrary(L"mydll.dll");
    P_Sum pSum = (P_Sum)::GetProcAddress(hSimplex, "sum");
    int* mas=pSum();        

    int k0=mas[0];
    int k1=mas[1];
    int k2=mas[2];
    int k3=mas[3];
    int k4=mas[4];
    int i=0;
    for(int i=0;i<5;i++)
    {
        cout<<mas[i]<<" ";

    }

    cout<<endl;
    cout<<k0<<endl;
    cout<<k1<<endl;
    cout<<k2<<endl;
    cout<<k3<<endl;
    cout<<k4<<endl;
    ::FreeLibrary(hSimplex);
    return 0;
}

В итоге на консоль выводится следующее:

0 1245096 4280280 4278017 1245032
0
1
2
3
4

Но по идее должно получаться так:

0 1 2 3 4
0
1
2
3
4

Подскажите, в чем причина и где ошибка?

Ответы

▲ 2

Вы возвращаете указатель на массив, память для которого выделяется в функции

int* sum()
{
    int s[5];
    for(int i=0;i<5;i++) s[i]=i;
    return s;
}

После выхода из функции, память, выделенная в стэке для массива s вообще говоря, освобождается.