途中で落ちる理由が知りたいです。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
qazwsx

途中で落ちる理由が知りたいです。

#1

投稿記事 by qazwsx » 3年前

コード:

#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;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 途中で落ちる理由が知りたいです。

#2

投稿記事 by みけCAT » 3年前

pDataには1要素分しか確保されていないバッファへのポインタ
(またはmallocが失敗した場合NULL)が代入されているのに、
存在しない2~10要素目へのアクセスがあるため、未定義動作になります。
範囲外へのアクセスが具体的にどうして落ちるのに繋がるかは環境によりますが、
・ヒープの管理情報を破壊し、malloc()やfree()で不都合が出た
・OSの管理レベルで確保されていない場所にアクセスした
・AddressSanitizerなどの範囲外へのアクセスを検出する仕組みに引っかかった
などが考えられます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

qazwsx

Re: 途中で落ちる理由が知りたいです。

#3

投稿記事 by qazwsx » 3年前

みけCATさん回答ありがとうございます。
とても参考になり、解決してすっきりしました。m(*_ _)m

返信

“C言語何でも質問掲示板” へ戻る