C ++ динамикалық бөлінген 2D массивінің толық жады?

Мен C ++ оқуды бастадым, қарапайым 2D массивін енгізуді және оның өлшемін std :: vector қолданбай алуды қаладым. Дегенмен, менің екінші өлшеміммен біртүрлі қателерге ұшырамын:

int **data= new int*[2];
for (int i = 0; i<2;i++){
    data[i] = new int[3];
}

data[0][0] = 1;
data[0][1] = 2;
data[0][2] = 3;

data[1][0] = 4;
data[1][1] = 5;
data[1][2] = 6;

data[1][25] = 20; //Should segfault? AAAAA

cout << "Data[1][25] = " << data[1][25] << endl; //Should segfault, no?

int n = sizeof(data[0])/sizeof(int);
int m = sizeof(data)/sizeof(int);
cout << "M is " << m << " N is " << n << endl;// Reports m = 2, n =2?!?!? BBBB

AAAA менде segfault алу керек, жоқ? Оның орнына құндылықты тағайындаймын және оны кейінірек оқуға мүмкіндігім бар. data [1] [кез келген] мәні мәні бойынша нөлге тең, мысалы, ол баптандырылды. Бұл екінші өлшемдегі мәселе ғана, бірінші өлшем күтілгендей әрекет етеді.

Кейінірек BBBB n үшін дәл өлшемді ала алмаймын. Мен бір нәрсе істемеймін бе?

0

15 жауаптар

C ++ массивтерде байланысты тексермейді. Массивтің шекарасынан тыс деректерге қол жеткізу белгісіз мінез-құлық болып табылады және ештеңе болмауы мүмкін. Бұл мүмкін , ол мүмкін болмауы мүмкін. Егер сізде жиымдан бұрынғы немесе кейінгі жады бөлімдері бар болса, орнына сол жадқа кіруге немесе өзгертуге болады. Бұл сіздің бағдарламаңыз пайдаланатын басқа деректердің бұзылуына әкелуі мүмкін.

Сондай-ақ sizeof қолданғаныңыз дұрыс емес. sizeof - компиляция уақыты . Ол массивтің өлшемін орындау уақытында көрсеткіш мәні арқылы анықтау үшін пайдаланылмайды. Егер Сізге бұл функционалдылық қажет болса std :: array немесе std :: vector .

char somearray[10];
int size = sizeof(somearray);//result is 10. Yay it works.

char *somearrayptr = new char[10];
int size = sizeof(somearrayptr); //size = the size of char* not char[10].
3
қосылды

C ++ массивтерде байланысты тексермейді. Массивтің шекарасынан тыс деректерге қол жеткізу белгісіз мінез-құлық болып табылады және ештеңе болмауы мүмкін. Бұл мүмкін , ол мүмкін болмауы мүмкін. Егер сізде жиымдан бұрынғы немесе кейінгі жады бөлімдері бар болса, орнына сол жадқа кіруге немесе өзгертуге болады. Бұл сіздің бағдарламаңыз пайдаланатын басқа деректердің бұзылуына әкелуі мүмкін.

Сондай-ақ sizeof қолданғаныңыз дұрыс емес. sizeof - компиляция уақыты . Ол массивтің өлшемін орындау уақытында көрсеткіш мәні арқылы анықтау үшін пайдаланылмайды. Егер Сізге бұл функционалдылық қажет болса std :: array немесе std :: vector .

char somearray[10];
int size = sizeof(somearray);//result is 10. Yay it works.

char *somearrayptr = new char[10];
int size = sizeof(somearrayptr); //size = the size of char* not char[10].
3
қосылды

C ++ массивтерде байланысты тексермейді. Массивтің шекарасынан тыс деректерге қол жеткізу белгісіз мінез-құлық болып табылады және ештеңе болмауы мүмкін. Бұл мүмкін , ол мүмкін болмауы мүмкін. Егер сізде жиымдан бұрынғы немесе кейінгі жады бөлімдері бар болса, орнына сол жадқа кіруге немесе өзгертуге болады. Бұл сіздің бағдарламаңыз пайдаланатын басқа деректердің бұзылуына әкелуі мүмкін.

Сондай-ақ sizeof қолданғаныңыз дұрыс емес. sizeof - компиляция уақыты . Ол массивтің өлшемін орындау уақытында көрсеткіш мәні арқылы анықтау үшін пайдаланылмайды. Егер Сізге бұл функционалдылық қажет болса std :: array немесе std :: vector .

char somearray[10];
int size = sizeof(somearray);//result is 10. Yay it works.

char *somearrayptr = new char[10];
int size = sizeof(somearrayptr); //size = the size of char* not char[10].
3
қосылды

C ++ массивтерде байланысты тексермейді. Массивтің шекарасынан тыс деректерге қол жеткізу белгісіз мінез-құлық болып табылады және ештеңе болмауы мүмкін. Бұл мүмкін , ол мүмкін болмауы мүмкін. Егер сізде жиымдан бұрынғы немесе кейінгі жады бөлімдері бар болса, орнына сол жадқа кіруге немесе өзгертуге болады. Бұл сіздің бағдарламаңыз пайдаланатын басқа деректердің бұзылуына әкелуі мүмкін.

Сондай-ақ sizeof қолданғаныңыз дұрыс емес. sizeof - компиляция уақыты . Ол массивтің өлшемін орындау уақытында көрсеткіш мәні арқылы анықтау үшін пайдаланылмайды. Егер Сізге бұл функционалдылық қажет болса std :: array немесе std :: vector .

char somearray[10];
int size = sizeof(somearray);//result is 10. Yay it works.

char *somearrayptr = new char[10];
int size = sizeof(somearrayptr); //size = the size of char* not char[10].
3
қосылды

AAAA-да сізде белгісіз мінез-құлық бар. Осыған байланысты барлық нәрсе болуы мүмкін - және одан да қызықты, тіпті бұрын.

Стандартты C ++-де «segfault» сияқты мінез-құлық жоқ. Және оны жүзеге асыру кейбір операцияларды анықтауға мүмкіндік береді, бірақ мен ешқашан алаңдаған жоқпын. Бұл тек кейбір жағдайларда кездейсоқ орын алады.

2
қосылды

AAAA-да сізде белгісіз мінез-құлық бар. Осыған байланысты барлық нәрсе болуы мүмкін - және одан да қызықты, тіпті бұрын.

Стандартты C ++-де «segfault» сияқты мінез-құлық жоқ. Және оны жүзеге асыру кейбір операцияларды анықтауға мүмкіндік береді, бірақ мен ешқашан алаңдаған жоқпын. Бұл тек кейбір жағдайларда кездейсоқ орын алады.

2
қосылды
data[1][25] = 20; //Should segfault? AAAAA

Орналасқан жеріңізге кіруге тыйым салынған болса, ол бұзылады. C ++ жүйесінде тексеріп шығуыңыз жоқ, сіз кіретін жеріңіз код-көрінісі параметрін қолдануға жарамды.

Сіз сол жерде сақталғандықтан, шығысқа ие болдыңыз. Бұл бір нәрсе еді. Бұл анықталмаған мінез-құлық және сіз әрдайым бірдей нәтиже ала алмайсыз.

бұл жауапын қараңыз жергілікті айнымалылар, бірақ бұл деректерге қол жеткізудің анықталмаған мінез-құлқының болуы туралы жақсы мысалдар келтіреді

data and data[0] are both pointers (doesn't matter single or double). They have a defined size for every implementation. In your case, size of pointer is twice that of size of int on your machine. Hence, the output. sizeof when used with pointers pointing to arrays (and not arrays i.e. ones declared as arrays char a[] etc) gives the size of the pointer

1
қосылды
data[1][25] = 20; //Should segfault? AAAAA

Орналасқан жеріңізге кіруге тыйым салынған болса, ол бұзылады. C ++ жүйесінде тексеріп шығуыңыз жоқ, сіз кіретін жеріңіз код-көрінісі параметрін қолдануға жарамды.

Сіз сол жерде сақталғандықтан, шығысқа ие болдыңыз. Бұл бір нәрсе еді. Бұл анықталмаған мінез-құлық және сіз әрдайым бірдей нәтиже ала алмайсыз.

бұл жауапын қараңыз жергілікті айнымалылар, бірақ бұл деректерге қол жеткізудің анықталмаған мінез-құлқының болуы туралы жақсы мысалдар келтіреді

data and data[0] are both pointers (doesn't matter single or double). They have a defined size for every implementation. In your case, size of pointer is twice that of size of int on your machine. Hence, the output. sizeof when used with pointers pointing to arrays (and not arrays i.e. ones declared as arrays char a[] etc) gives the size of the pointer

1
қосылды
data[1][25] = 20; //Should segfault? AAAAA

Орналасқан жеріңізге кіруге тыйым салынған болса, ол бұзылады. C ++ жүйесінде тексеріп шығуыңыз жоқ, сіз кіретін жеріңіз код-көрінісі параметрін қолдануға жарамды.

Сіз сол жерде сақталғандықтан, шығысқа ие болдыңыз. Бұл бір нәрсе еді. Бұл анықталмаған мінез-құлық және сіз әрдайым бірдей нәтиже ала алмайсыз.

бұл жауапын қараңыз жергілікті айнымалылар, бірақ бұл деректерге қол жеткізудің анықталмаған мінез-құлқының болуы туралы жақсы мысалдар келтіреді

data and data[0] are both pointers (doesn't matter single or double). They have a defined size for every implementation. In your case, size of pointer is twice that of size of int on your machine. Hence, the output. sizeof when used with pointers pointing to arrays (and not arrays i.e. ones declared as arrays char a[] etc) gives the size of the pointer

1
қосылды

Массивтің шекарасынан тыс кіру - бұл анықталмаған әрекет . Сондықтан кез-келген нәрсені күтуге ешқандай себеп жоқ: ол бүлінуі, дұрыс жауап қайтаруы, дұрыс емес жауапты қайтаруы, бағдарламаның басқа бөлігіндегі деректерді үнсіз бұзуы немесе басқа мүмкіндіктердің бар болуы.

1
қосылды

Массивтің шекарасынан тыс кіру - бұл анықталмаған әрекет . Сондықтан кез-келген нәрсені күтуге ешқандай себеп жоқ: ол бүлінуі, дұрыс жауап қайтаруы, дұрыс емес жауапты қайтаруы, бағдарламаның басқа бөлігіндегі деректерді үнсіз бұзуы немесе басқа мүмкіндіктердің бар болуы.

1
қосылды

Массивтің шекарасынан тыс кіру - бұл анықталмаған әрекет . Сондықтан кез-келген нәрсені күтуге ешқандай себеп жоқ: ол бүлінуі, дұрыс жауап қайтаруы, дұрыс емес жауапты қайтаруы, бағдарламаның басқа бөлігіндегі деректерді үнсіз бұзуы немесе басқа мүмкіндіктердің бар болуы.

1
қосылды

Деректердің екеуі де [0] және деректер көрсеткіштер болып табылады. Көрсеткіштер 32 биттік жүйе өлшемі 4 және 64 биттік жүйеде 8 болады. Сондықтан m және n тең. Int өлшемі әрдайым 4.

0
қосылды

Деректердің екеуі де [0] және деректер көрсеткіштер болып табылады. Көрсеткіштер 32 биттік жүйе өлшемі 4 және 64 биттік жүйеде 8 болады. Сондықтан m және n тең. Int өлшемі әрдайым 4.

0
қосылды

Деректердің екеуі де [0] және деректер көрсеткіштер болып табылады. Көрсеткіштер 32 биттік жүйе өлшемі 4 және 64 биттік жүйеде 8 болады. Сондықтан m және n тең. Int өлшемі әрдайым 4.

0
қосылды