C语言中数组赋值问题总结

很多学生在学习C语言时,在数组的地方会有点困惑。

1.数组必须指定长度,而其数组定义的长度不能是变量或者浮点数,一定是常量表达式;

2.数组的赋值,有两种,一是在定义的时候就进行初始化,或者单个引用来赋值。

但有个问题:

#include <stdio.h>

int main(void)
{
	int a[5] = {1,2,3,4,5};
	a[5] = 10;
	printf("a[5] = %d\n",a[5]);
	return 0;
}

结果:

a[5] = 10
Press any key to continue

上述代码编译没有问题,但代码写的是错误的

数组长度为5,元素只有a[0]-a[4],没有a[5]元素。但为什么给a[5]赋值没有报错或告警呢?另外这个值到底赋给了谁呢?

我们可以同变量的地址来发现问题。

代码:

#include <stdio.h>

int main(void)
{
	int i = 0;
	int b[5];
	int a[5] = {1,2,3,4,5};
	a[5] = 10;
	for(i=0;i<5;i++)
	{
		printf("数组a[%d]的地址 = %X\n",i,&a[i]);
	}
	for(i=0;i<5;i++)
	{
		printf("数组b[%d]的地址 = %X\n",i,&b[i]);
	}
	printf("数组a[5]的地址 = %X\n",&a[5]);
	return 0;
}

结果:

数组a[0]的地址 = 19FF04
数组a[1]的地址 = 19FF08
数组a[2]的地址 = 19FF0C
数组a[3]的地址 = 19FF10
数组a[4]的地址 = 19FF14
数组b[0]的地址 = 19FF18
数组b[1]的地址 = 19FF1C
数组b[2]的地址 = 19FF20
数组b[3]的地址 = 19FF24
数组b[4]的地址 = 19FF28
数组a[5]的地址 = 19FF18
Press any key to continue

你会发现a[5]的地址和b[0]的地址一样,所以在给a[5] = 10;时实际上是篡改了b[0]中的内容,我们可以试一下:

 代码:

#include <stdio.h>

int main(void)
{
	int i = 0;
	int b[5];
	int a[5] = {1,2,3,4,5};
	a[5] = 10;
	for(i=0;i<5;i++)
	{
		printf("数组a[%d]的地址 = %X\n",i,&a[i]);
	}
	for(i=0;i<5;i++)
	{
		printf("数组b[%d]的地址 = %X\n",i,&b[i]);
	}
	printf("数组a[5]的地址 = %X\n",&a[5]);

	printf("数组a[5]的值 = %d\n",a[5]);
	printf("数组b[0]的值 = %d\n",b[0]);
	return 0;
}

结果为:

数组a[0]的地址 = 19FF04
数组a[1]的地址 = 19FF08
数组a[2]的地址 = 19FF0C
数组a[3]的地址 = 19FF10
数组a[4]的地址 = 19FF14
数组b[0]的地址 = 19FF18
数组b[1]的地址 = 19FF1C
数组b[2]的地址 = 19FF20
数组b[3]的地址 = 19FF24
数组b[4]的地址 = 19FF28
数组a[5]的地址 = 19FF18
数组a[5]的值 = 10
数组b[0]的值 = 10
Press any key to continue

可以明显看出a[5]的赋值实质上修改了b[0]的值,这个对于初学者来说是大忌,在以后的开发过程中会经常出现这样的问题,这种问题属于踩内存,贼不好定位。所以大家在学习时一定要注意!!!!

数组的长度为N,那数组元素只能有0~N-1个元素

 

 

<think>嗯,用户问的是如何在C语言中对整型数组进行赋值,我需要详细解释不同的方法。首先,我得回忆一下C语言数组的基本概念,然后想想有哪些赋值方式。比如静态数组初始化、循环赋值、动态数组内存分配,可能还有结构体中的数组赋值。用户提供的引用里提到了静态数组、动态数组,以及结构体中的数组赋值,这些都需要涵盖进去。 首先,静态数组初始化应该是最基础的。可以举例子,比如声明时直接赋值,或者部分初始化后的默认值。引用3里提到数组初始化的重要性,所以需要强调显式初始化的必要性。 然后是循环赋值,这在处理用户输入或者需要动态计算值时很常见。用户提到的引用3中的例子用循环给字符数组赋值,类似的方法可以应用到整型数组上,这里需要给出一个循环读取输入的示例。 接下来是动态数组,引用2里详细讲了使用malloc分配内存,这时候赋值方式和静态数组类似,但需要先分配内存。可能需要注意检查内存是否分配成功,并在使用后释放内存,避免内存泄漏。 结构体中的数组赋值,引用4里提到用strcpy给字符数组赋值,但整型数组可能需要逐个赋值或者memcpy。不过用户的问题是关于整型的,所以可能需要调整示例,比如用循环或者直接逐个元素赋值。 另外,用户可能需要知道如何批量赋值,比如使用memset或者memcpy函数。但memset通常用于字节级别的设置,比如初始化为0,而memcpy可以复制内存块,适合数组之间的复制。 还需要注意数组越界的问题,引用3里提到初始化剩余元素,所以在赋值时要确保不超出数组长度。比如循环时控制索引范围,或者动态数组根据用户输入的大小处理。 最后,总结不同方法的适用场景,比如静态初始化用于已知值,循环用于运行时输入,动态数组用于不确定大小的情况,结构体内数组则需要逐个或memcpy处理。确保示例代码正确,语法无误,并且注释清楚,帮助用户理解每一步的操作。</think>在C语言中,整型数组赋值方法根据使用场景和数组类型有所不同,以下是具体实现方法及示例: --- ### 一、静态数组直接初始化 适用于已知数组元素的场景 ```c // 完全初始化 int arr1[5] = {1, 2, 3, 4, 5}; // 部分初始化(未赋值的元素自动为0) int arr2[5] = {10, 20}; // [10,20,0,0,0] // 自动推断数组长度 int arr3[] = {100, 200, 300}; // 长度自动设为3 ``` --- ### 二、循环赋值 适用于运行时动态赋值或批量操作 ```c #include <stdio.h> #define SIZE 5 int main() { int arr[SIZE]; // 用户输入赋值 printf("输入%d个整数:\n", SIZE); for(int i=0; i<SIZE; i++){ scanf("%d", &arr[i]); } // 数学规律赋值 for(int i=0; i<SIZE; i++){ arr[i] = i * 10; // 生成0,10,20,30,40 } return 0; } ``` --- ### 三、动态数组赋值 需配合内存分配函数使用[^2] ```c #include <stdio.h> #include <stdlib.h> int main() { int size; int *dynamicArr; printf("输入数组大小:"); scanf("%d", &size); dynamicArr = (int*)malloc(size * sizeof(int)); if(!dynamicArr) { printf("内存分配失败\n"); return 1; } // 赋值操作与静态数组相同 for(int i=0; i<size; i++){ dynamicArr[i] = i * 2; } free(dynamicArr); // 必须释放内存 return 0; } ``` --- ### 四、结构体中的数组赋值 对于结构体成员数组的特殊处理[^4] ```c typedef struct { int id; int values[5]; } DataSet; int main() { DataSet ds; // 逐个赋值 for(int i=0; i<5; i++){ ds.values[i] = i + 1; } // 内存拷贝赋值(需保证类型安全) int src[] = {10,20,30,40,50}; memcpy(ds.values, src, sizeof(src)); return 0; } ``` --- ### 五、注意事项 1. **数组越界**:索引值必须满足 $0 \leq index < array\_size$ 2. **内存初始化**:未显式赋值的元素可能包含随机值,建议显式初始化[^3] 3. **动态数组**:必须验证 `malloc` 返回值,使用后必须调用 `free` ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小材大用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值