クロスボーダーの配列のGCC処理

1.道路だけで済プログラミングの問題:

5以下の指定された整数、
請求項に
数桁によって決定される1、
2つの出力の各桁
3桁の逆の順序で出力が、例えば、321の元の数、123を出力します

サンプル入力
12345

出力例
。5
。1 5 4 3 2
54321

2.次のように私は、コードを提出は、次のとおりです。

#include <stdio.h>
#include <string.h>
int main()
{
	int len;             //num输入,len存储数组长度
	int num;
	int i;
	char s[5];               //最大存储5个字符
	scanf("%d",&num);
	sprintf(s,"%d",num);  //转换为数字字符串 
	len = strlen(s);

	printf("%d\n",len);
	for ( i=0;i < len;i++){
		printf("%c ",s[i]);
	}
	printf("\n");
	for ( i= len-1;i>=0;i--){
		printf("%c",s[i]);
	}
	printf("\n");
    return 0;
}

ここに画像を挿入説明
ここに画像を挿入説明

配列境界、実行時エラーに私を促した私はすべてが正常であるコンパイルにはgccを使用しますが、サイトには、プログラムにアップロードされます。

ここに画像を挿入説明

3.根本的な原因

1.そこ\ 0を終了する文字の配列があるので、格納された値が複数である必要があり、コードは次のように記述する必要があります。

#include <stdio.h>
#include <string.h>
int main()
{
	int len;             //num输入,len存储数组长度
	int num;
	int i;
	char s[6];               //最大存储5个有效字符,注意字符数组已\0结尾
	scanf("%d",&num);
	sprintf(s,"%d",num);  //转换为数字字符串 
	len = strlen(s);

	printf("%d\n",len);
	for ( i=0;i < len;i++){
		printf("%c ",s[i]);
	}
	printf("\n");
	for ( i= len-1;i>=0;i--){
		printf("%c",s[i]);
	}
	printf("\n");
    return 0;
}

2. gccがあるため与えられていない理由:

GCC-4.3.2配列境界の最適化後、例えば:配列TMP [100]、国境を越えた動作が発生した場合、アクセス、すなわち、S [6]へのアクセスは、最終的に[Sを制限する、アレイの境界に限定される定義5]、クロスボーダーは本当に起こるのではないでしょう。

ここに画像を挿入説明
gccの-v現在のバージョンを確認するには:

ここに画像を挿入説明

だから、書き込みコードは、GCCの高いバージョンは文句を言わないが、標準化されなければならないが、GCC環境の低いバージョンへの移行の場合には大きな問題となります。

参考リンク:https://blog.51cto.com/lion3875/530264

リリース8元の記事 ウォンの賞賛4 ビュー3254

おすすめ

転載: blog.csdn.net/Codeliang666/article/details/103941103