c 二维数组动态分配和释放
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 二维数组动态分配和释放的更多相关文章
- c指针与数组,传参问题,指针数组与数组指针的区别,二维数组动态内存分配
一 数组的结构:顺序存储,看谭浩强中的图,牢记 1.数组名指代一种数据结构:数组 现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的 ...
- C语言 二维数组(指针)动态分配和释放(转)
C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...
- C语言如何动态分配二维数组
C语言如何动态分配二维数组(转载) 原文链接:https://www.cnblogs.com/0xWitch/p/9314621.html 使用malloc().free()函数进行动态分配,这两个函 ...
- c++ 动态分配二维数组 new 二维数组
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _T ...
- C++中动态申请二维数组并释放方法
C/C++中动态开辟一维.二维数组是非常常用的,以前没记住,做题时怎么也想不起来,现在好好整理一下. C++中有三种方法来动态申请多维数组 (1)C中的malloc/free (2)C++中的new/ ...
- C++基础:二维数组动态的申请内存和释放内存
使用二维数组的时候,有时候事先并不知道数组的大小,因此就需要动态的申请内存.常见的申请内存的方法有两种:malloc/free 和 new/delete. 一.malloc/free (1)申请一维数 ...
- 2017.11.17 C++系列---用malloc动态给c++二维数组的申请与释放操作
方法一:利用二级指针申请一个二维数组. #include<stdio.h> #include<stdlib.h> int main() { int **a; //用二级指针动态 ...
- 二维数组的动态分配(new)、初始化(memset)和撤销(delete)
来自http://blog.csdn.net/maverick1990/article/details/22829135 一维数组 动态分配,int *array = new int[10] 初始化, ...
- C/C++动态二维数组的内存分配和释放
C语言: 1 //二维数组动态数组分配和释放 //数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(ch ...
随机推荐
- GGGGCCCC
Evaluating and improving remembered sets in the HotSpot G1 garbage collector http://www.diva-portal. ...
- [Windows Azure]The Autoscaling Application Block
The Autoscaling Application Block 5 out of 6 rated this helpful - Rate this topic ...
- 每日英语:America The Vulgar
'What's celebrity sex, Dad?' It was my 7-year-old son, who had been looking over my shoulder at my c ...
- C# 类型实例化的语法糖--unity下诡异结果
类型实例化语法糖就是如下的用法: public class Abc { public int ID { get; set; } public string Name { get; set; } pub ...
- Logistic回归分析简介
Logistic回归:实际上属于判别分析,因拥有很差的判别效率而不常用. 1. 应用范围: ① 适用于流行病学资料的危险因素分析 ② 实验室中药物的剂量-反应关系 ③ 临床试验 ...
- java框架篇---Struts入门
首先理解Struts与MVC的关系 在传统的MVC模式中所有的请求都要先交给Servlet处理,之后由Servlet调用JavaBean,并将结果交给JSP中进行显示.结构图如下 Struts是Apa ...
- Gnome3 安装系统监视器
. . . . . 之前使用Gnome2的时候可以向面板上添加一个系统监视器,相信很多人都用过这个实用的小工具,可以很方便的了解系统的运行概况.但是自从使用了Gnome3之后这个小工具不见了,Gnom ...
- centos7 安装oracle jdk 与openjdk 实现切换
1. 分别安装oraclejdk 与openjdk #下载安装oraclejdk rpm -ivh --prefix=/usr.java/java1.8 ***.rpm #安装openjdk su - ...
- laravel服务l队列资料整理
Laravel 队列系列 —— 基于 Redis 实现任务队列的基本配置和使用 1.概述 在Web开发中,我们经常会遇到需要批量处理任务的场景,比如群发邮件.秒杀资格获取等,我们将这些耗时或者高并发的 ...
- 浅谈C#中的深拷贝(DeepCopy)与浅拷贝(MemberwiseClone)
场景:MVVM模式中数据双向绑定,想实现编辑.保存.撤销操作时也双向绑定了,不能实现撤销操作. 后来通过搜索找到了继承IEditableObject接口实现撤销操作,但是对其中使用了Memberwis ...