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. VS Code插件Vue2 代码补全工具

    一.简介 此扩展将Vue 2代码片段和语法突出显示添加到Visual Studio代码中. 这个插件基于最新的Vue官方语法高亮文件添加了语法高亮,并且依据Vue 2的API添加了代码片段. 支持语言 ...

  2. C#中int、long、float、double、decimal最大值最小值

    最近在将java上写的一个简单的表达式求值计算器移植到Windows Phone 8,java中double的精度问题是很明显的,解决办法是改用BigDecimal类.所以觉得C#中用double也是 ...

  3. 定期批量修改远程服务器root密码

    一.背景 很多时候运维或安全工作人员需要维护大量的服务器,其中就包括判断是否存在root弱口令, 如果服务器数量很多一一修改的话的确是要好花费不少时间精力的.如果通过脚本来实现密码更改, 再做一个定期 ...

  4. [Windows Azure] Building worker role B (email sender) for the Windows Azure Email Service application - 5 of 5.

    Building worker role B (email sender) for the Windows Azure Email Service application - 5 of 5. This ...

  5. (原创)谈谈boost.asio的异步发送

    在上一篇博文中提到asio的异步发送稍微复杂一点,有必要单独拿出来说说.asio异步发送复杂的地方在于: 不能连续调用异步发送接口async_write,因为async_write内部是不断调用asy ...

  6. (原创)C++11改进我们的程序之简化我们的程序(四)

    这次要讲的是:c++11统一初始化.统一begin()/end()和for-loop循环如何简化我们的程序 初始化列表 c++11之前有各种各样的初始化语法,有时候初始化的时候还挺麻烦,比较典型的如v ...

  7. Android 编程下通过 zipalign 对 APK 文件进行优化

    zipalign zipalign is an archive alignment tool that provides important optimization to Android appli ...

  8. setRequestedOrientation

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//通过程序改变屏幕显示的方向 1.landscape:横屏(风景 ...

  9. Android Service GetSystemService

    http://blog.sina.com.cn/s/blog_71d1e4fc0100o8qr.html http://blog.csdn.net/bianhaohui/article/details ...

  10. Win7中的路由转发配置实验

    目的 Win7  两张网卡,两个网段的pc互通. 环境搭建 PC1通过交叉网线连接(如果是08年后的电脑,直通线交叉线都可以). PC2为笔记本电脑,一端用网口与pc连接,一端通过wifi与路由连接. ...