【c语言】——关于数组的那些事儿

xiaoxiao2025-11-18  6

一提到数组,想必大家对此是再熟悉不过的了吧,那么今天就由我带大家再对此了解一下吧~

一、数组的初始化问题

1、数组【数字】,关于数字所代表的意义 数字在定义是表示的是数组的长度,在使用时代表其下标。注意!!!这个下标是从0开始的。 2、初始化的情况 正确的:

int a[10] = {0,1,2,3,4,5,6,7,8,9}; int a[] = {1,2,3,4,5};编译器会根据后面数字的长度来给空间 int arr[2] = {1,2,3};虽然多了,但是编辑器会根据实际的空间数给

错误的:

int drr[]; 编辑器不知道是啥 int a = 10;int hrr[a]; 长度不能未知,但是c99可以支持

二、数组越界问题

关于数组越界,那么就要先补充一下相关知识 1.局部变量的定义 答:局部变量是定义在函数体中的变量,内存区域在栈里,数据先进后出,地址下面大上面小。 2.例题讲解

输入一段代码: #include<stdio.h> int main() { int i; int arr[10]; for(i=0;i<=10;i++) { arr[i]=0; printf("%d",i); } return 0; } 它们在栈中的存储位置如

输出结果:运行结果死循环或者程序崩溃。 原因分析: 如图所示(栈在给数组分配空间时,直接给4*10=40个字节,然后数组自己排序) 当i=10时,10<=10 所以a[10]=0,但并无a[10],而i在9下面 所以i=0,又因为i=0<=10,所以i++,所以一直死循环,运行结果是死循环或者崩溃。 4.如何解决: 可以加入两个值作为“炸弹”来隔开,若值给了这个“炸弹”,则终止,程序报错。 但如果想无限循环也可以if(i=10) { i=12; } 则跳过了炸弹。

三、二维数组

1、二维数组和一维数组的比较 2、二维数组例题——矩阵的逆置

#include <stdio.h> #include <stdlib.h> int main() { int n,i,j,a[110][110],b[110][110]; scanf("%d",&n); for(i=0; i<n; i++) { for(j=0; j<n; j++) { scanf("%d",&a[i][j]); } } for(i=0; i<n; i++) { for(j=0; j<n; j++) { b[j][i]=a[i][j]; } } for(i=0; i<n; i++) { for(j=0; j<n; j++) { if(j==0) printf("%d",b[i][j]); else printf(" %d",b[i][j]); } printf("\n"); } return 0; }

四、动态数组问题

1、malloc (1)malloc的返回值为void*返回了无效的指针传递给了分配空间或者是NULL(申请失败) (2)操作

int *p = (int*) malloc(n*sizeof(int));

2、calloc用于分配内存中的一个数的元素并初始化为0 操作为:

int *p = (int*) calloc(n*sizeof(int));

具体实现为:

int main() { int n = 10; int *p = (int*)malloc(n*sizeof(int)); for(int i=0;i<10;i++) { p[i] = 0; } return 0; }

3、relloc用于内存的扩充 操作为:

int *p = (int*) ralloc(2*n*sizeof(int));

具体实现为:

int main() { int n = 10; int *p = (int*)malloc(n*sizeof(int)); for(int i=0;i<n;i++) { p[i] = i; } int *q = (int*)malloc(2*n*sizeof(int)); for(int i=0;i<n;i++)//此处的循环还是应该是n,如果为2*n的话p[i]要越界 { q[i] = p[i]; } free(p); p = q; q = NULL; return 0; }

补充知识点 1、为什么要把p free掉而不是置空呢? 因为free是把p格子中保存的值,其指针地址一直是不变的 2、动态数组的内存空间是由程序员自主申请的,所以是堆内存。堆内存块的头记录内存的大小,尾用于free时将小的内存合并成更大的内存块 3、free崩溃的本质

越界了,漏写了sizeof修改了指针指向,比如p++重复释放同一段内存不能释放非动态创建的内存
转载请注明原文地址: https://www.6miu.com/read-5039887.html

最新回复(0)