c动态语言

函数声明的头文件在<stdlib.h>

使用malloc函数为字符串分配内存 --》记得释放内存 free()

#include <stdio.h>
#include <stdlib.h>
#include <string.h> char *concat(const char *s1, const char *s2); int main(void) {
char *p;
p = concat("abc", "def");
printf("%s\n", p); //abcdef
return ;
} char *concat(const char *s1, const char *s2) { char *result; result = malloc(strlen(s1) + strlen(s2) + );
if (result == NULL) {
printf("Error: malloc failed in concat\n");
exit(EXIT_FAILURE);
}
strcpy(result, s1);
strcat(result, s2); //放数据
return result;
}

利用动态内存,字符串数组

#include <stdlib.h>
#include <stdio.h>
#include <string.h> #define MAX_REMIND 50
#define MSG_LEN 60 int read_line(char str[], int n); int main() {
char *reminders[MAX_REMIND]; //定义字符串数组
char day_str[], msg_str[MSG_LEN + ]; // day_str是为了转换日期用,msg_str是存储字符串,存进数组用
int day, i, j, num_remind = ; for (;;) {
if (num_remind == MAX_REMIND) {
printf("-- No space left --\n");
break;
}
printf("Enter day and reminder: ");
scanf("%2d", &day);
if (day == )
break;
sprintf(day_str, "%2d", day); //把day转换成字符串
read_line(msg_str, MSG_LEN); //输入字符,变成字符串 /* for (i = 0; i < num_remind; i++) { // num_remind记录了有多少个字符串,这个步骤校验有问题,应该放到下面去
printf("ii: %d\n",i); if (strcmp(day_str, reminders[i]) < 0)
break;
}
for (j = num_remind; j < i; j++)
reminders[j] = reminders[j - 1];*/ reminders[i] = malloc( + strlen(msg_str) + ); //创建动态内存
if (reminders[i] == NULL) {
printf("-- No space left --\n");
break;
}
// printf("i: %d\n", i);
strcpy(reminders[i], day_str);
strcat(reminders[i], msg_str); // 放数据
i++;
num_remind++;
}
printf("\nDay Reminder \n");
for (i = ; i < num_remind; i++) {
printf(" %s\n", reminders[i]);
}
return ;
} int read_line(char str[], int n) {
char ch;
int i = ;
while ((ch = getchar()) != '\n')
if (i < n)
str[i++] = ch;
str[i] = '\0';
return i;
}

一、 已知第二维

#include <stdlib.h>
#include <stdio.h>
#include <string.h> #define MAX_REMIND 50
#define MSG_LEN 60 int main() {
char (*a)[MSG_LEN + ];
a = (char (*)[MSG_LEN]) malloc(sizeof(char *) * MAX_REMIND);
strcpy(a[], "abcd");
printf("%s\n", a[]); //abcd;
free(a);
a = NULL; //防止野指针
return ;
} // 优化后的写法
int main() { char (*a)[MSG_LEN + ] = malloc(MSG_LEN + );
if (a == NULL) {
printf("malloc error");
exit();
} strcpy(a, "abcd");
printf("a = %s\n", a); free(a);
a = NULL;
return ;
}

二、 已知第二维

三、 已知第一维, 一次分配内存(保证内存的连续性)

四、两维都未知

五、两维都未知, 一次分配内存(保证内存的连续性)

注意:静态二维数组作为函数参数传递

如果采用上述几种方法动态分配二维数组,那么将对应的数据类型作为函数参数就可以了。这里讨论静态二维数组作为函数参数传递,即按照以下的调用方式:

int a[][];
func(a);

C语言中将静态二维数组作为参数传递比较麻烦,一般需要指明第二维的长度,如果不给定第二维长度,则只能先将其作为一维指针传递,然后利用二维数组的线性存储特性,在函数体内转化为对指定元素的访问。
首先写好测试代码,以验证参数传递的正确性:
(1)给定第二维长度

Code-
void func(int a[][N])
{
printf("%d\n", a[][]);
}

(2)不给定第二维长度

Code-
void func(int* a)
{
printf("%d\n", a[ * N + ]);//计算元素位置
}

注意:使用该函数时需要将二维数组首地址强制转换为一维指针,即func((int*)a);

c 二维数组动态分配和释放的更多相关文章

  1. c指针与数组,传参问题,指针数组与数组指针的区别,二维数组动态内存分配

    一 数组的结构:顺序存储,看谭浩强中的图,牢记 1.数组名指代一种数据结构:数组 现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的 ...

  2. C语言 二维数组(指针)动态分配和释放(转)

    C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...

  3. C语言如何动态分配二维数组

    C语言如何动态分配二维数组(转载) 原文链接:https://www.cnblogs.com/0xWitch/p/9314621.html 使用malloc().free()函数进行动态分配,这两个函 ...

  4. c++ 动态分配二维数组 new 二维数组

    #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _T ...

  5. C++中动态申请二维数组并释放方法

    C/C++中动态开辟一维.二维数组是非常常用的,以前没记住,做题时怎么也想不起来,现在好好整理一下. C++中有三种方法来动态申请多维数组 (1)C中的malloc/free (2)C++中的new/ ...

  6. C++基础:二维数组动态的申请内存和释放内存

    使用二维数组的时候,有时候事先并不知道数组的大小,因此就需要动态的申请内存.常见的申请内存的方法有两种:malloc/free 和 new/delete. 一.malloc/free (1)申请一维数 ...

  7. 2017.11.17 C++系列---用malloc动态给c++二维数组的申请与释放操作

    方法一:利用二级指针申请一个二维数组. #include<stdio.h> #include<stdlib.h> int main() { int **a; //用二级指针动态 ...

  8. 二维数组的动态分配(new)、初始化(memset)和撤销(delete)

    来自http://blog.csdn.net/maverick1990/article/details/22829135 一维数组 动态分配,int *array = new int[10] 初始化, ...

  9. C/C++动态二维数组的内存分配和释放

    C语言: 1 //二维数组动态数组分配和释放 //数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(ch ...

随机推荐

  1. 深入理解Linux内核-I/O体系结构和设备驱动程序

    系统总线:1.链接CPU.RAM.I/O设备之间的数据流动.例如:PCI.ISA.EISA.MCA.SCSI.USB2.任何I\O设备有且仅能链接一条总线. I\O端口:1.每个连接到I\O总线上的设 ...

  2. CSS中字体响应式的设置

    在进行页面响应式设计中,往往需要根据屏幕分辨率来显示不同大小的字体.通常的做法是通过media queries给不同的分辨率指定不同的字体样式,例如: body { font-size: 22px; ...

  3. async与await 实例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. K8s 介绍

    Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展. 使用Kubernetes可以: 1. 自动化容器的部署和复制 2. 随时扩展或收缩容器规模 3. 将 ...

  5. angular-resource版本差异问题

    在 AngularJS v1.3.0-beta.14 这个版本里,使用query方法,如果传递进来的数据不是数组,会报错. 在 AngularJS v1.2.18 这个版本里,使用query方法,如果 ...

  6. 【delphi】多线程与多线程同步

    在 Delphi 中使用多线程有两种方法: 调用 API.使用 TThread 类; 使用 API 的代码更简单. CreateThread function CreateThread( lpThre ...

  7. 使用Python实现Map Reduce程序

    使用Python实现Map Reduce程序 起因 想处理一些较大的文件,单机运行效率太低,多线程也达不到要求,最终采用了集群的处理方式. 详细的讨论可以在v2ex上看一下. 步骤 MapReduce ...

  8. hdu3938(最小生成树,推荐)

    题意描述:简单的讲就是,给你一张无向图,求有多少条路径使得路径上的花费小于L,这里路径上的花费是这样规定的,a.b两点之间的多条路径中的最长的边最小值! 思路:这题目有多个询问,肯定要用离线输出.思路 ...

  9. .NET ramework 4.0安装失败

    1.停止Window 升级服务: 2.Windows 目录下的 SoftwareDistribution 重命名: 3.安装 .Net Framework 下面是百度上的方法,比较复杂 解决方法:1) ...

  10. iOSUITableView头部带有图片并且下拉图片放大效果

    最近感觉UITableview头部带有图片,并且下拉时图片放大这种效果非常炫酷,所以动手实现了一下,效果如下图: 1.gif 实现原理很简单,就是在UITableview上边添加一个图片子视图,在ta ...