sizeof和mallo

简介: *p++等同于*(p++),二者均为从右向左 NULL和'\0'对指针常量是等价的,只不过用NULL强调指针,或用#define     这样一看才知道大家对空指针的概念如此浑浊哦!!首先:void* 这不叫空指针,这叫无确切类型指针.

*p++等同于*(p++),二者均为从右向左


NULL和'\0'对指针常量是等价的,只不过用NULL强调指针,或用#define

 

 

这样一看才知道大家对空指针的概念如此浑浊哦!!
首先:
void* 这不叫空指针,这叫无确切类型指针.这个指针指向一块内存,却没有告诉程序该用何

种方式来解释这片内存.所以这种类型的指针不能直接进行取内容的操作.必须先转成别的

类型的指针才可以把内容解释出来.

还有'\0',这也不是空指针所指的内容. '\0'是表示一个字符串的结尾而已,并不是NULL的

意思.

真正的空指针是说,这个指针没有指向一块有意义的内存,比如说:
char* k;
这里这个k就叫空指针.我们并未让它指向任意地点.
又或者
char* k = NULL;
这里这个k也叫空指针,因为它指向NULL 也就是0,注意是整数0,不是'\0'
一个空指针我们也无法对它进行取内容操作.
空指针只有在真正指向了一块有意义的内存后,我们才能对它取内容.也就是说要这样
k = "hello world!";
这时k就不是空指针了.


9.动态数组
#include<stdlib.h>
int *dynarry=(int *)malloc(10*sizeof(int));

如果调用成功,便可dynarry[i](i从0到9)


如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,

应使用free()函数将内存块释放。 malloc的语法是:指针名=(数据类型*)malloc(长度

),(数据类型*)表示指针.


动态分配数组之后,还可以改变其大小realloc
dynarry=(int *)realloc((void *)dynarry,20*sizeof(int));
如果能够在原地扩大区域,则返回原来的指针;如果在其他地方,返回新内存区域的地址

,原有指针变得不可用;否则一直找不到,返回空指针。因此,一般设置一个临时指针

newarray,if(newarray!=NULL)  dynarray=newarray;else{fprintf(stderr,"Can't
 reallocate!\n")

 

fun(int *a)
{
int i=sizeof(a);
printf("%d\n",i);
}

C编译器把数组当做指针,所以返回值是4,不是数组的所占字节数

判断数组定义时有几个元素
int a[10]={13,45};
int num=sizeof(a)/sizeof(a[0]//分母或者为sizeof(int),答案均为10

 

int a[10],*p;
p=a;
malloc(sizeof(p))//只能分配四个字节,不是40个字节,返回的只是指针本身的大小

 


char *t=malloc(strlen(s)+1);//有字符串结束标志,malloc返回分配的首地址,
strcpy(t,s);最好乘以sizeof(char)


用malloc申请的空间,除非程序退出,否则只能用free释放

目录
相关文章
|
7月前
|
安全 编译器 C语言
动态内存管理(malloc、calloc、realloc)详解
动态内存管理(malloc、calloc、realloc)详解
88 0
|
5月前
|
程序员 编译器 C语言
C语言动态内存管理函数(malloc、free、calloc、realloc)
开辟内存空间的⽅式有两个缺点: • 空间开辟⼤⼩固定 • 数组声明时,必须指定数组的⻓度,长度⼀旦确定了便不能调整 而实际情况是,很多时候我们所需要的空间⼤⼩只有在程序运⾏后才能知道,为此C语⾔引⼊了动态内存开辟这个概念,让程序员⾃⼰可以申请和释放内存空间,这样就显得比较灵活了。
|
7月前
|
编译器 程序员 C语言
【C语言】动态内存管理(malloc,free,calloc,realloc,柔性数组)
【C语言】动态内存管理(malloc,free,calloc,realloc,柔性数组)
|
6天前
|
编译器
练习使用动态内存相关的4个函数:malloc、calloc、realloc、free
在了解使用动态内存相关的四个函数之前,我们先了解一下,为什么要有动态内存分配?
15 0
|
18天前
|
程序员 编译器 C语言
C语言知识:动态内存管理(malloc free calloc realloc)
C语言知识:动态内存管理(malloc free calloc realloc)
|
4月前
|
C语言
C语言——动态内存管理(malloc, calloc, realloc, free, 柔性数组详解)
C语言——动态内存管理(malloc, calloc, realloc, free, 柔性数组详解)
|
10月前
|
编译器 算法 C语言
动态内存函数详解-【malloc,calloc,realloc,free】
动态内存函数详解-【malloc,calloc,realloc,free】
动态内存函数详解-【malloc,calloc,realloc,free】
|
5月前
|
存储 程序员 编译器
动态内存分配(malloc和free​、calloc和realloc​)
动态内存分配(malloc和free​、calloc和realloc​)
|
7月前
|
编译器 C语言
C语言——动态内存函数(malloc、calloc、realloc、free)
C语言——动态内存函数(malloc、calloc、realloc、free)
|
9月前
|
编译器 C语言
动态内存分配—malloc calloc realloc free 和常见动态内存错误
我们熟知的内存开辟方式有两种:第一种便是通过等关键字为变量开辟空间;第二种便是通过开辟一段连续的空间。这样开辟的空间很局限:1. 空间开辟大小是固定的。2. 数组在声明的时候,必须指定数组的长度,它所需要的内存在编译时分配。动态内存分配所开辟的空间在堆区,并且是可以扩容的。