#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
typedef struct{
int d0;
int d1;
int d2;
int d3;
}data_t;
data_t func(data_t* pData,int i){
//pData = malloc(sizeof(data_t));
pData[i].d0 = 19;
pData[i].d1 = 19;
pData[i].d2 = 19;
pData[i].d3 = 19;
printf("%d:d0=%d d1=%d d2=%d d3=%d p=%p\n",i, pData[i].d0, pData[i].d1, pData[i].d2, pData[i].d3, pData);
return *pData;
}
int main(){
//data_t data;
data_t* pData;
data_t* p = pData;
for(int i=0;i<10;i++){
pData = (data_t*)malloc(sizeof(data_t));
pData[i].d0 = 33;
pData[i].d1 = 33;
pData[i].d2 = 33;
pData[i].d3 = 33;
printf("========================\n");
printf("%d:d0=%d d1=%d d2=%d d3=%d p=%p\n",i, pData[i].d0, pData[i].d1, pData[i].d2, pData[i].d3, pData);
*pData = func(pData,i);
printf("%d:d0=%d d1=%d d2=%d d3=%d p=%p\n",i, pData[i].d0, pData[i].d1, pData[i].d2, pData[i].d3, pData);
}
printf("========================\n");
printf("========================\n");
for(int i=0;i<10;i++){
printf("d0=%d d1=%d d2=%d d3=%d p=%p\n", (pData+i)->d0, pData[i].d1, pData[i].d2, pData[i].d3, pData[i]);
}
free(pData);
return 0;
}
途中で落ちる理由が知りたいです。
途中で落ちる理由が知りたいです。
Re: 途中で落ちる理由が知りたいです。
pDataには1要素分しか確保されていないバッファへのポインタ
(またはmallocが失敗した場合NULL)が代入されているのに、
存在しない2~10要素目へのアクセスがあるため、未定義動作になります。
範囲外へのアクセスが具体的にどうして落ちるのに繋がるかは環境によりますが、
・ヒープの管理情報を破壊し、malloc()やfree()で不都合が出た
・OSの管理レベルで確保されていない場所にアクセスした
・AddressSanitizerなどの範囲外へのアクセスを検出する仕組みに引っかかった
などが考えられます。
(またはmallocが失敗した場合NULL)が代入されているのに、
存在しない2~10要素目へのアクセスがあるため、未定義動作になります。
範囲外へのアクセスが具体的にどうして落ちるのに繋がるかは環境によりますが、
・ヒープの管理情報を破壊し、malloc()やfree()で不都合が出た
・OSの管理レベルで確保されていない場所にアクセスした
・AddressSanitizerなどの範囲外へのアクセスを検出する仕組みに引っかかった
などが考えられます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)