配列サイズに関するコードで大きな誤りがあったことに気がついたときに私が書いたコードで少しのテストを行ってきました。 ここには何が起こっているのかを知るための簡単なコードがあります。構造体の宣言されていない配列にデータが格納されています
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int score;
}player;
void printScore(player *p, int num);
int main(void)
{
printf ("\nEnter number of players (1 - 4)\n");
scanf ("%d", &numPlayers);
player *p = (player*)malloc(sizeof(player) * 3);
for (i=0;i<numPlayers;i++)
{
printScore(p, i);
}
}
void printScore(player *p, int num)
{
p[num].score = 1;
printf ("%d\n", p[num].score);
}
実際には、malloc関数の3はnumPlayersである必要があります。 私が3にしておき、メニューに高い数字を入力すると、プログラムは通常クラッシュしますが、時にはうまくいきます。そんなことがあるものか? p [0]、p [1]、p [2]のために十分なメモリしか予約されていない場合、p [15] .scoreにどのようにデータが格納されるのでしょうか?
可能な複製:http://stackoverflow.com/questions/8641478/invalid-read-write-sometimes-creates-segmentation-fault-and-sometimes-does-not/ –
何をコンパイルしていますか?いくつかのコンパイラは、このような動作がクラッシュ* all *の原因となることを保証します。 – detly