В чем ошибка?(с++)

wizard42

#include "stdafx.h"
#include <iostream.h>
#include <stdlib.h>
void null(char a[])
{
for(int i = 0; i < 10; i++)
{
a[i] = '\0';
}
}
void main
{
char cArr[10];
cout << "Введите числа: \n";
int nNumber = 0;
int nLength = 0;
int* pArr = new int;
null(cArr);
while(1)
{
cin.getline(cArr, 10);
if(cArr[0] = = ';')
break;
nLength++;
nNumber = atoi(cArr);
*pArr = nNumber;
pArr++;
null(cArr);
nNumber = 0;
}
}
? подскажите плз. . .

maggi14

наверно, в слове "= ="
а вообще, почему б тебе не опустить глаза и не посмотреть, на что ругается компилятор?

Dasar

есть подозрение, что это все компилируется, а ошибка позже

wizard42

да, именно так. . .

maggi14

тогда почему бы не отдебаджить?

wizard42

во время дебага все в порядке, только в конце просит указать какой-то путь. . .

Dasar

Так что там дебажить, если там промах по памяти

wizard42

а где именно. . .как исправить?

Dasar

в pArr ты пишешь больше, чем под него выделяешь место
выделить больше места.

ppplva

 *pArr = nNumber;
pArr++;

Что это должно делать ?

maggi14

какой промах? память под очередные пАрр не выделяется? И черт с ней, скорее всего, хоть и не гарантированно, все сработает

Dasar

так вот она негарантированно и работает.

enochka1145

int* pArr = new int;
Может, int* pArr = new int[сколько-нибудь]; ?
А то
pArr++;
сразу же вылезает за пределы отведённой памяти (в размере одного int-а).

wizard42

если я потом прошу мне выдать число под любым номером, которое захочу (если я его ввел) он выводит, а потом говорит об ошибке. . .

maggi14

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

wizard42

я ж динамически создаю память. . .
чем тогда отличаются
int* pArr = new int;
от
int* pArr;
?

maggi14

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

wizard42

а если я пишу
char* pChar = new char
я выделяю только под один char место?
нет, это указатель на строку неопределенной длины, размером до 4Гб. . .

Zoulla

да, под один

maggi14

> нет, это указатель на строку неопределенной длины, размером до 4Гб. .
ничего подобного. Даже не понимаю, с чего тебе это в голову пришло.
char * pChar - это указатель не на строку, а на единственный байт. И оператором нью ты и выделяешь под него один байт.

wizard42

так в чем тогда разница (см. выше) с new и без?

Zoulla

В первом случае выделяется память под один int, во втором вообще не выделяется.

maggi14

new int выделил память на один инт. Кстати, кошерно в конце проги эту память освободить оператором delete.
Тебе нужно было (int*) new int[100], или вообще использовать malloc какой-нибудь.

wizard42

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

maggi14

поменять схему. Например, использовать CArray. Или массу других готовых классов и контейнеров.

Zoulla

Вместо pArr заведи vector<int> v;
А вместо *pArr = nNumber; pArr++; пиши v.push_back(nNumber)
Ботай STL короче, а вообще С по нормальному сначала выучи.

wizard42

и почему, тогда,
char* pChar = new char;
cout << "vvedite stroku \n";
cin >> pChar;
cout << pChar << "\n";
работает(правда с косяками, но работает а
char* pChar;
cout << "vvedite stroku \n";
cin >> pChar;
cout << pChar << "\n";
нет?

maggi14

может, ответ тебе не понравится, но он, по-моему, верный: так повезло. В данный момент так распределение памяти легло.
Короче, последуй совету Кома

zzzzzzzzzzz

Экспериментальное изучение C++

wizard42

ок, косяк мой. . .

4223080

В первом случае ты выделяешь память под один символ, т.е. хоть памяти и маловато, но указатель по крайней мере инициализирован корректно и указывает в кучу, а во втором случае он указывает в любую точку неба. Доступ по этому указателю запрещается на уровне железа
Оставить комментарий
Имя или ник:
Комментарий: