Я довольно новичок в программировании и изучаю C. Я пытаюсь создать простую переполнение буфера и уметь прогнозировать результаты как упражнение, но при попытке сделать это не удалось даже создать переполнение , Я использую MinGW, и, похоже, он автоматически настраивает мой массив для соответствия содержимому. Я компилирую с -Wall и -Wextra, но ошибок не выталкивают. Что именно здесь происходит? Почему бы мне не получить segfault? Разве мой nNum не должен быть написан? И не должно ли что-то жаловаться, когда я делаю случайную запись где-то, я не должен касаться? Благодаря!Автоматическая проверка границ?
#include <stdio.h>
#include <string.h>
/* Array index - something to be sure that you're outside of szArray */
#define SZ_LOCATION 15
int main(void)
{
/* Initialize array and number. Store 1000 to number, and "hello\0" to array */
char szArray[6];
unsigned short nNum = 1000;
strcpy(szArray, "hello");
printf("SZ_LOCATION = %i\n\n", SZ_LOCATION);
/* Print current contents of szArray ("hello"). Print the char at the preset index location, and the current (unchanged) value of nNum */
printf("szArray = %s\n", szArray);
printf("szArray[SZ_LOCATION] = %c\n", szArray[SZ_LOCATION]);
printf("nNum = %d\n\n", nNum);
/* Add 3 chars to szArray, to push it over 6 chars. Re-print all variables */
strcat(szArray, "BIG");
printf("szArray = %s\t(%I64u bytes)\nszArray[7] = %c\nnNum = %d\n\n", szArray, sizeof(szArray), szArray[sizeof(szArray) + 1], nNum);
/* Store a random char to the preset location in the array, way out there, and re-print its contents, with the new size of the array */
szArray[SZ_LOCATION] = 'h';
printf("szArray = %s\nszArray[SZ_LOCATION] = %c\nsizeof(szArray) = %I64u\n", szArray, szArray[SZ_LOCATION], sizeof(szArray));
return 0;
}
Программа работает нормально (я имею в виду, что она дает мне ошибку сокрушения), чего вы не достигнете? Я скомпилировал с помощью 'gcc -Wall' – Nullpointer
Поскольку неопределенное поведение не означает, что вы всегда будете видеть * его; это означает, что когда-нибудь где-нибудь, когда вы даете демо потенциальному покупателю-партнеру, который пишет восьмизначные чеки, вы, скорее всего, увидите это * тогда * (и так будет, и тогда будет много плачущих, воющих , и скрежет зубов ...). Вы просите «окончательное» действие от того, что «неопределено». – WhozCraig
@WhozCraig Должен быть действительно большой баннер при вводе тега [C]. Этот вопрос повторяется каждый день в бесконечном разнообразии форм :) – user3125367