程序猿之---C语言细节11(数组下标越界后测试、数组下标中“ ,”运算符,副作用)

主要内容:数组下标越界后测试、数组下标中“ ,”运算符,副作用

#include <stdio.h>

int main(int argc, char ** argv)
{
	int a[2]={1,2},b[2] = {3,4};//输出未知值
	int i = 0;

	printf("%d\n",b[0,2]); //逗号为一种运算符,b[0,2]被当成b[2],在这里b[2]是超出
	                       // 了下标,但是输出为1,是a[0]的值(通过改变a[0]的值输出也改变),
						   // 我分别测试了以下几种情况,结果总结为在循环时用i做数组下标及
						   // 循环结束条件要特别考虑不要越界,如果越界很可能数组越界操作
						   // 会改变i的值,使循环无法结束 

	//int k = 6,b[2] = {3,4},a[2]={1,2},j = 5;//输出未知值,改为b[0,3] 则输出6
	//int k = 6,a[2]={1,2},b[2] = {3,4};//输出值为1
	//int a[2]={1,2},j = 5,b[2] = {3,4};//输出未知值,改为b[0,3] 则输出5
	//int k = 6,a[2]={1,2},j = 5,b[2] = {3,4};//输出未知值,改为b[0,3] 则输出5 

	while(i < 2)
	{
		a[i] = b[i++];  //有副作用
	}
	i = 0;
	while(i < 2)
	{
		printf("a[%d] = %d\n", i , a[i]);
		i++;
	}
	return 0;
}

输出:

时间: 2024-08-07 08:39:13

程序猿之---C语言细节11(数组下标越界后测试、数组下标中“ ,”运算符,副作用)的相关文章

程序猿之---C语言细节24(段错误、类型提升、sizeof &#39;A&#39;)

主要内容:段错误.类型提升.sizeof  'A' #include <stdio.h> int main() { union test{ char a[10]; int b; }u; int *p = (int *)&(u.a[1]); // 没有引起总线错误 *p = 17; printf("%d\n",*p); #if 0 int *q = 0; // 引起段错误,在linux中运行可看到段错误,在windows下运行时直接出错 *q = 1; #endif

程序猿之--C语言细节13(二维数组和指针,&amp;*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)

主要内容:二维数组和指针,&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

程序猿之---C语言细节28(const变量初始化、数组大小用const变量细节、const变量与#define宏、volatile修饰)

主要内容:const变量初始化.数组大小用const变量细节.const变量与#define宏.volatile修饰 一.const变量初始化时必须赋值 二.const变量在C++中可以做数组大小元素.在C中不行,因为它是变量 三.const和#define区别:内存分配 四.volatile修饰一些变量:易被操纵系统.硬件.多线程修改的变量 #include <stdio.h> int main() { /* 测试1 */ const int b; // 不初始化会报错 // b = 2;

程序猿之---C语言细节29(#define宏大小、空结构体大小、柔性数组不知道你见过没)

主要内容:#define宏大小.空结构体大小.柔性数组 一.#define宏大小 见例子 二.空结构体大小 根编译器有关 三.柔性数组 不常用,可看看 #include <stdio.h> #define N 4 #define STR "abcd" int main() { struct student { }stu; printf("N = %d\n", sizeof(N)); printf("num 5 memery = %d\n&quo

程序猿之--C语言细节15(预处理命令细节#error、运算符#和##、__FILE__、__LINE__)

主要内容:预处理命令细节#error.运算符#和##.__FILE__.__LINE__ #include <stdio.h> /* 包含这个头文件,并不是将其所有函数都链接进程序*/ /* ##运算符 */ #define MK_ID(n) i##n /* 表示将两个记号连接 */ int MK_ID(1), MK_ID(2),MK_ID(3); /* 预处理后变成int i1,i2,i3;*/ /* 定义多个type##_max函数,函数返回类型和参数类型用define决定 * 如GENE

程序猿之---C语言细节22(函数返回指针注意事项&lt;悬空指针&gt;、查看进程可以分配的内存大小)

主要内容:函数返回指针注意事项<悬空指针>.查看进程可以分配的内存大小 #include <stdio.h> char * favorite_fruit() { static char fruit[] = "apple"; // 不加static的话这个函数还回的指针以及悬空,因为在函数退出时fruit组数被销毁 // 加了static后fruit数组分配在数据段里,而不是堆栈中,生命期和程序一样长,函数退出时变量 // 依然有效 return fruit; }

程序猿之---C语言细节9

主要内容:宏定义.max(a,b)宏定义细节.大小端判断.(int&)a什么意思 #if 1 #include <stdio.h> // 注意空格 #define F (x) ((x) - 1) // F代表后面 #define F(x) ((x) - 1) // F(x)代表后面 #define T1 struct type* T1 a,b; // 使用上面在定义多个变量时达不到目的,被解析为struct type* a,b; a为指向结构体的指针,而b被定义为一个结构体 // 经典

程序猿之---C语言细节(指针和数组细节,&quot;//&quot;的可移植性说明)

主要内容:指针和数组细节,"//"的可移植性说明 #include <stdio.h> int main(int argc, char **argv) { int a[10]={1,2,3,4,5,6,7,8,9,0},*p; #if 0 /* 按移植性来说,在<c语言程序设计--现代方法>指出要用当前注释方法,而不是// 因为一些编译可能不支持 */ // 错误举例 while(*a != 0) { a++; // a++ 相当于a = a+1,不能改变a的值

程序猿之---C语言细节30(数组和指针操作测试题,你能全答对吗??)

主要内容:数组和指针操作测试 #include <stdio.h> int main() { int a[5] = {1,2,3,4,5}; /* 你能答对最后一条语句的输出吗?*/ int *ptr1 = (int *)(&a+1); int *ptr2 = (int *)((int)a+1);  printf("&a = %d\n",(&a)); printf("(&a+1) = %d\n",(&a+1));