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 ...
随机推荐
- hdu 1875 畅通工程再续(prim方法求得最小生成树)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1875 /************************************************* ...
- 行为类模式(四):迭代器(Iterator)
定义 提供一种方法访问一个容器(container)对象中的各个元素,而又不暴露该对象的内部细节. UML 优点 简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通 ...
- 正确使用 Volatile 变量
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”:与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少, ...
- [Windows Azure] How to use the Windows Azure Blob Storage Service in .NET
How to use the Windows Azure Blob Storage Service in .NET version 1.7 version 2.0 This guide will de ...
- “一键制作启动u盘失败”的主要原因是什么?
一键制作启动u盘失败的主要原因是什么?今天u启动小编就和大家一起来分析原因并寻求答案吧! 原因分析: 1.u盘内有文件正在运行或者是打开: 2.u盘自身的质量问题: 3.最主要的原 ...
- 基于jQuery点击缩略图右侧滑出大图特效
基于jQuery点击缩略图右侧滑出大图特效是一款基于strip.pkgd插件实现的点击左侧缩略图右侧滑出大图切换代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div ...
- jQuery实现radio第一次点击选中第二次点击取消功能(转)
转载自:http://www.jb51.net/article/113730.htm 由于项目的需求,要求radio点击两次后为取消状态,不方便修改为checkbox,可以用正面的方法实现. // j ...
- python dataframe (method,partial,dir,hasattr,setattr,getarrt)
# * _*_ coding:utf-8 _*___author__:'denny 20170730'from functools import reduceimport functoolsimpor ...
- wpf/wp/win8中的代码编写过程
0.根据需求文档,完成前端界面显示 1.定义事件,初始化事件并定义方法. 2.定义加载数目和当先显示数目,定义方法所需要的变量. 3.编写方法所需要的接口以及接口实现. 4.在方法中引用接口. 5.实 ...
- php去除字符串中的HTML标签
php自带的函数可以去除/删除字符串中的HTML标签/代码. strip_tags(string,allow):函数剥去 HTML.XML 以及 PHP 的标签. 参数:string,必填,规定要检查 ...