Run-time check failure przy kompilacji programu [C++]

0

Witam wszystkich. =]

Otóż realizuję takie oto sobie zadanko:

Napisz funkcję, która do końca stringu podanego w jednej tablicy, dołączy
    string, będący w drugiej
tablicy. Argumentami tej funkcji powinny być:
- adres tablicy docelowej,
- jej rozmiar,
- adres tablicy ze stringiem dołączanym.
Funkcja powinna przerwać dołączanie stringu w przypadku zapełnienia całej 
    tablicy.

I napisałem taki oto kod w Microsoft Visual Studio:

#include "stdafx.h"
#include <iostream>

using namespace std;

void dolacz(char docelowa[], int rozmiar, char dolaczana[]);  //deklaracja funkcji
//***********************************
int _tmain(int argc, _TCHAR* argv[])
{
	char bazowa[]={"Baza"};
	cout<<"Przed dolaczeniem:\n";
	int rozmiar1=0;		//inicjalizacja rozmiaru bazowego C-stringu
	for(int i=0; ; i++)	//wypisanie i policzenie rozmiaru bazowej tablicy
	{
		rozmiar1++;
		if(bazowa[i]==NULL)
			break;
		cout<<bazowa[i];
	}
	char dodatkowa[]={"Dolaczenie"};
	cout<<"\nTo sie dolaczy:\n";
	int rozmiar2=0;		//inicjalizacja rozmiaru dołączanego C-stringu
	for(int i=0; ; i++)	//wypisanie i policzenie rozmiaru dołączanej tablicy
	{
		rozmiar2++;
		if(dodatkowa[i]==NULL)
			break;
		cout<<dodatkowa[i];
	}
	int rozmiar = rozmiar1 + rozmiar2 - 1;	//inicjalizacja rozmiaru całego C-stringu(po dołączeniu)
	cout<<endl;
	dolacz(bazowa, rozmiar, dodatkowa);  //Wywołanie funkcji
	cout<<endl;
	system("pause");
	return 0;
}
//************************************
void dolacz(char docelowa[], int rozmiar, char dolaczana[])
{
	cout<<"Po dolaczeniu:\n";
	int rozmiar2=0;
	for(int i=0; ; i++)		//rozmiar dołączanej tablicy
	{
		rozmiar2++;
		if(dolaczana[i]==NULL)
			break;
	}
	for(int i=rozmiar-rozmiar2; ; i++)		//operacja dołączania
	{
		docelowa[i]=dolaczana[i-(rozmiar-rozmiar2)];
		if(docelowa[i] == NULL)
			break;
	}
	for(int i=0; ; i++)		//wypisanie po dołączeniu
	{
		if(docelowa[i]==NULL)
			break;
		cout<<docelowa[i];
	}
}

Jednak podczas kompilacji, a konkretniej wywoływania się funkcji system("pause"), która to prosi mnie o wciśnięcie jakiegokolwiek klawisza, po wciśnięciu go program się crashuje. Wyskakuje taki komunikat:

Run- Time Check Failure #2 - Stack around the variable 'bazowa' was corrupted.

Co może być powodem tego błędu? Dodam, że w kompilatorze Bloodshed Dev-C++ tego problemu nie ma.

Z góry dziękuję =]

0

http://ideone.com/Vm9hgl

tutaj masz dowód że bez system("pause") działa
ogólnie nie powinno się zatrzymywać konsoli w ten sposób do sprawdzania "co konsola wyplula"(przez system("pause")) od tego jest IDE by to robiło. Gdzieś w opcjach visuala jest by nie zamykał samoczynnie konsoli (musisz pogooglować) jeżeli chcesz bardzo zatrzymać konsole to możesz zrobić coś na zasadzie

int zmienna;
cin << zmienna

czy inny jaki kolwiek kod proszący użytkownika o podanie jakiś danych lub wciśnięcia jakiegokolwiek przycisku.

0

Dziękuję za szybką odpowiedź, jednak po ujęciu w komentarz system("pause");, problem dalej występuje.

3

Run- Time Check Failure #2 - Stack around the variable 'bazowa' was corrupted.

Oznacza, że najpewniej mażesz po nieswojej pamięci (w tym wypadku nadpisujesz stos); z tego co widzę, to wychodzisz poza zakres tablicy docelowa, przeleć debugerem cały kod i zobacz dokładniej.

Btw, dlaczego nie skorzystasz z wbudowanych funkcji strlen oraz memcpy?

0

Btw, dlaczego nie skorzystasz z wbudowanych funkcji strlen oraz memcpy?

W tym cała idea zadania :D.

z tego co widzę, to wychodzisz poza zakres tablicy docelowa, przeleć debugerem cały kod i zobacz dokładniej.

Przeleć debugerem? Nie rozumiem... Jedyny błąd jaki debuger wywala po kompilacji to właśnie ten.

0

W tym cała idea zadania

Ja osobiście preferowałbym najpierw napisanie korzystając z tych obydwu funkcji z biblioteki standardowej, a potem je samemu zaimplementował :P

Przeleć debugerem? Nie rozumiem... Jedyny błąd jaki debuger wywala po kompilacji to właśnie ten.

Przeleć debuggerem każdą linijkę kodu i sprawdzaj wartości zmiennych patrząc, czy nie wykraczają poza zakresy tablic; chyba wiesz, jak się używa debuggera (zatem powinieneś wiedzieć o czym mówię), a jak nie wiesz, to poczytaj na internecie :P

0

Już wiem o co chodziło. W sumie, zaczynając ten program wiedziałem, że nie mogę tak zrobić :P.
C-string bazowa miał zarezerwowane w pamięci 5 elementów, a w funkcji dolacz próbowałem zapełniać elementy 6-ty, 7-my itd..
W mainie zmieniłem jej definicję na taką: char bazowa[100]={"Baza"}; i działa jak należy, tylko bardzo chciałem uniknąć takiego rozwiązania :(.
Jeszcze raz wszystkim dziękuję :).
P.S. Może ktoś ma pomysł, jak to rozwiązać inaczej?

0

P.S. Może ktoś ma pomysł, jak to rozwiązać inaczej?

Dynamiczna alokacja pamięci maybe?
Zmień deklarację na coś w rodzaju:

char* concat(char first[], char second[], int len)

(tzn.po cokolwiek to len, przecież rozmiar można pobrać za pomocą strlen lub odpowiednika :P)
I zwracaj połączony ciąg znaków poprzez wynik funkcji (return), nie zapominając o przydzieleniu dynamicznie pamięci o rozmiarze rozmiar(first) + rozmiar(second) + sizeof(char) (dodajemy rozmiar chara, ponieważ nie możemy zapomnieć o null-terminatorze na samym końcu).

1 użytkowników online, w tym zalogowanych: 0, gości: 1