Interessante Frage. Auch wenn ich mich noch nie damit beschäftigen musste (und ich grad im Prüfungsstress bin), dachte ich mir ich nehm mir mal ein paar Minuten um drüber nach zu denken.
memset() nimmt die Zahl die ihr übergeben wird als unsigned char. Auf gut Deutsch: da unsigned char immer 1 Byte groß ist (bzw. sein sollte), werden die ersten 8 Bits der übergebenen Zahl (oder eben 1 Byte) genommen, und überall in jede Speicheradresse geschrieben.
Ein short sollte üblicherweise 2 Byte groß sein.
Wenn du jetzt beispielsweise als value 2 übergibst (was 00000010 Binär ist), wird das in beide Speicherzellen für dein short geschrieben. Ergibt 00000010.00000010.
Ein cout auf irgendeine Stelle der map wird 514 ergeben (das ist die Zahl da oben Binär).
[-Anmerkung: Unterschied zw. Little Endian & Big Endian gibts hier nicht-]
Damit wäre geklärt was genau in die Speicherzellen geschrieben wird. Nur du willst eine negative Zahl speichern. Das ist jetzt doch um einiges schwieriger.
Bei Intel Maschinen werden negative Zahlen als Zweierkomplement abgelegt.
[-Zweierkomplement: Bits negieren und + 1 / erstes Bit gibt Vorzeichen an-]
Übergibt man nun -2 an memset, was das Zweierkomplement von 2 ist (also 11111110), werden diese Bits in beide Speicheradressen geschrieben. Ergibt 11111110.11111110.
Ein cout auf irgendeine Stelle der map ergibt jetzt -258, da das erste Bit die negative Zahl einleitet, und vom Rest das Zweierkomplement (hier x0000001.00000010) den Wert angibt = 258.
Jetzt zu deiner -2 die überall stehen soll: dafür müsste 11111111.111111110 in den Speicherzellen stehen. Das schaffst du aber nicht, da das unterschiedliche Bytes sind, und memset immer die gleichen in die Speicheradressen schreibt. Ich bin mir daher ziemlich sicher, dass das mit memset unmöglich zu bewerkstelligen ist.
Getestet hab ich das mit
short map[11][11];
memset(map, 1, sizeof(map));
// cout ergibt 257
memset(map, 2, sizeof(map));
// cout ergibt 514
memset(map, -2, sizeof(map));
// cout ergibt -258
Alles anzeigen
Das bestätigt meine Überlegungen. Hatte nie Zugriffsverletzungen...
(Getestet: 32 Bit Intel System (= Little Endian) mit msvc2005 Compiler)
Wichtig: bitte schlagt mich nicht, falls irgendwo ein Denkfehler drin ist...