C语言 二维数组复制、清零及打印显示

#include <stdlib.h> 
#include <stdio.h>
#include <string.h>

//二维整型数组打印显示 
void printarr2d(int (*a)[3],int row,int col)
{
 int i,j;
 for(i=0; i<row; i++)  
    {  
        for(j=0; j<col; j++)  
        {  
            printf("%d  ", a[i][j]);  
        } 
         printf("\n");    
    }  
}

main()
{
    int i,j;
    int a[2][3]={{1,2,3},{4,5,6}};
    int b[2][3];
    //二维数组复制(第三个参数为数组总的字节数)
    memcpy(b,a, 2*3*sizeof(int) );//memcpy(&b[0][0],&a[0][0],24);
    //二维数组打印显示 (before zero)
    printarr2d(b,2,3);
    //二维数组清零
    memset(b,0, 2*3*sizeof(int) );
    //二维数组打印显示 (after zero)
    printarr2d(b,2,3);
    system("pause");
    return 0;
}

 
c语言中如何复制一个二维数组的所有元素的值到另外一个二维数
使用for循环固然可以,但是总感觉非常麻烦
#include"stdio.h"
int main(void)
{ 
  int i,j;
  int a[2][5]={{1,2,3},{4,5,6,8}};  
  int b[2][5];
  for(i=0;i<2;i++)
  {
      for(j=0;j<5;j++)
      {
      b[i][j]=a[i][j];     
    }
  }   
  printf("%d",b[1][2]);
}
(1)
mencpy的原型是void *memcpy(void *dest, const void *src, size_t n); 1 为什么*memcpy这里前面有个*号?? 2 为什么函数的参数里面void * src 前面有个修饰符const 答: 1: memcpy 返回值为void * 2:加 const 变为常量指针 防止在memcpy中对src指向的内容进行修改,函数的健壮性考虑

自己做的时候,就在想,如何不适用二重for循环的办法,对二维数组进行复制操作

看了下优快云 的bbs结果真的有,非常感谢

注:

  1)使用memcpy函数,memset函数都要引入库文件 #include <string.h>

  2)本来想对这个复制函数封装的,后来感觉没必要,直接使用,只不过要注意第三个参数为:数组整体内存所占bit数,要小心

(2)

 memset(b,0, 2*3*sizeof(int) );
第一个值是数组地址,第二个是你要把数组中的值赋为多少,第三个是你要赋多少个元素。

总结版:

二维数组复制:

//二维数组复制(第三个参数为数组总的字节数) 
  memcpy(b,a, 2*3*sizeof(int) );//memcpy(&b[0][0],&a[0][0],24);

二维数组清零:

 //二维数组清零
  memset(b,0, 2*3*sizeof(int) );

 

转载于:https://www.cnblogs.com/shuqingstudy/p/5162585.html

<think>好的,用户想了解C语言中动态数组的使用方法,特别是malloc和realloc的使用教程。我需要根据提供的引用内容来组织回答,确保正确引用,同时遵循系统级指令中的格式要求。 首先,我应该先回顾用户提供的引用内容。引用1提到calloc与malloc的区别,以及realloc的作用。引用2详细说明了动态数组的实现步骤,包括malloc、realloc和free的使用,以及指针操作。引用3则涉及二维动态数组的例子,但用户的问题可能主要集中在单维数组,不过可能需要提到多维的情况。 接下来,我需要按照用户要求的结构来回答。首先,分步骤讲解动态数组的实现方法,然后给出代码示例,最后生成相关问题。要注意所有行内数学表达式用$...$,独立公式用$$...$$,不过在这个问题中可能数学公式不多,但如果有提到数组大小计算可能需要使用。例如,分配n个int的空间,可以写成$n \times \text{sizeof(int)}$。 需要确保使用中文回答,并且引用标识自然添加在引用的段落末尾。例如,当提到calloc和malloc的区别时,引用1;当提到动态数组的实现步骤时,引用2;当提到二维数组的例子时,引用3。 此外,用户可能关心常见错误,比如忘记检查malloc/realloc的返回值,内存泄漏等,这些需要包含在注意事项中。同时,代码示例要正确,符合C语法,并且有注释说明每个步骤。 最后,生成的相关问题需要围绕动态数组的深入应用、错误处理、优化等,可能的问题包括realloc的底层机制、多维度数组实现、避免内存碎片的方法等。 现在,我需要将这些内容整理成结构清晰的步骤,每个步骤结合引用,并确保代码正确。同时,检查是否所有行内表达式都正确使用$...$,独立公式是否需要,但在这个主题中可能较少用到数学公式,但如果有比如数组大小的计算,可能需要用行内格式。 例如,在步骤1中,使用malloc分配内存时,可以写`arr = (int*)malloc(size * sizeof(int));` 这里可能不需要数学格式,但如果有变量如size,可以写成$size$。不过根据示例,变量名如`arr`在代码块中已经用代码格式,可能不需要额外处理。不过系统指令要求所有行内数学表达式包括变量都要用$...$,所以可能需要将变量用$符号包裹,比如$size$,但代码块中的变量不需要,因为代码块是单独的格式。需要仔细检查。 例如,在步骤1的文本描述中,提到“分配$size \times \text{sizeof(int)}$字节的内存空间”,这里需要使用行内数学表达式。这样符合系统指令的要求。 总结,回答结构应该是: 1. 动态数组实现步骤 1.1 使用malloc分配内存(引用2) 1.2 使用realloc调整大小(引用2) 1.3 使用free释放内存(引用2) 1.4 指针操作元素(引用2) 2. 代码示例 给出完整的例子,包含初始化、调整大小、释放等步骤 3. 注意事项 - 检查返回值(引用2) - calloc与malloc的区别(引用1) - realloc可能返回NULL(引用2) - 二维数组的实现(引用3) 4. 相关问题 生成四个相关问题,覆盖应用场景、错误处理、优化和多维数组等 现在需要将每个部分结合引用,并正确标注引用标识。例如,当提到calloc和malloc的区别时,末尾添加[^1],当提到动态数组的实现步骤时,添加[^2],当提到二维数组时添加[^3]。 在注意事项中,关于calloc的部分需要引用,而realloc的使用注意引用[^2]。二维数组部分引用[^3]。 最后,确保代码正确,语法正确,使用正确的函数调用,比如malloc后检查是否为NULL,realloc后更新指针等。 可能还需要提到realloc在扩大内存时可能复制数据到新地址,释放旧内存,这一点在引用2中可能提到,但用户提供的引用2中只提到调整大小,没有详细说明机制,所以可能需要简要说明。 此外,在代码示例中,初始分配、重新分配、赋值、释放的步骤要完整,并注释每个部分的作用。 现在,将这些整理成自然的中文段落,分步骤说明,并正确引用。</think>### C语言动态数组使用教程 动态数组允许在程序运行时灵活管理内存,适用于数据量不确定的场景。以下是实现步骤和关键函数说明: --- #### 一、实现步骤 1. **使用`malloc`分配初始内存** ```c int *arr; int size = 10; arr = (int*)malloc(size * sizeof(int)); ``` 此代码分配$size \times \text{sizeof(int)}$字节的内存空间,返回指向数组首地址的指针。 2. **使用`realloc`调整数组大小** ```c int new_size = 20; int *temp = (int*)realloc(arr, new_size * sizeof(int)); if (temp != NULL) { arr = temp; // 更新指针 } ``` `realloc`会在扩大内存时自动复制原数据到新地址,并释放旧内存。 3. **释放内存`free`** ```c free(arr); arr = NULL; // 避免野指针 ``` 动态数组使用后必须手动释放内存,否则会导致内存泄漏。 4. **操作数组元素** ```c arr[0] = 10; *(arr + 1) = 20; ``` 通过指针或下标直接访问元素。 --- #### 二、代码示例 ```c #include <stdio.h> #include <stdlib.h> int main() { int *arr; int size = 5; // 初始分配 arr = (int*)malloc(size * sizeof(int)); if (arr == NULL) { printf("内存分配失败!"); return 1; } // 赋值 for (int i = 0; i < size; i++) { arr[i] = i * 2; } // 调整大小 int new_size = 10; int *temp = (int*)realloc(arr, new_size * sizeof(int)); if (temp == NULL) { free(arr); return 1; } arr = temp; // 释放内存 free(arr); arr = NULL; return 0; } ``` --- #### 三、注意事项 1. **检查返回值** `malloc`和`realloc`可能返回`NULL`,需判断是否分配成功。 2. **`calloc`与`malloc`的区别** `calloc`会将分配的内存初始化为0,适合需要清零的场景。 3. **避免内存泄漏** `realloc`失败时需手动释放原指针,否则原内存无法访问[^2]。 4. **二维动态数组** 可通过指针数组实现,例如: ```c double **data = (double**)malloc(rows * sizeof(double*)); for (int i = 0; i < rows; i++) { data[i] = (double*)malloc(cols * sizeof(double)); } ``` 需逐层释放内存[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值