C语言malloc函数及数组初始长度的辨析

        

        知名的教材在编写中总是给出了很多伪代码,虽然说从意图上来说只要将代码的逻辑表达清楚就没什么问题,不过很多书中的伪码有些过于逆天,会误导许多基础不扎实的人;另一方面,毕竟每个人的编码习惯不同,可能有些高手喜欢写生僻的代码来让人云里雾里语法的规则。。。。博主总结了一些基础的小细节,见字如面:

目录

一.C语言

1.size必须声明

2.malloc函数 

三.耍赖的玩法 

二.C++

三.伪码误导

1.算法笔记

2.王道考研


一.C语言

1.size必须声明

大一我们在学习的时候,老师说C语言的数组是定长的,如果不声明长度就无法通过编译,如下,第1、2行是正确的,而第三行会提示没有声明大小:

	int arr1[3];
	int arr2[]={1,2,3};
	int arr3[];

2.malloc函数 

        malloc函数相信大家都不陌生,这是数据结构中常见的声明动态数组的方式,格式如下:

int* p=(int*)malloc((sizeof(int)*num)

上述语句的执行逻辑一定要理清楚:

  1. 首先是通过sizeof获取当前数据类型的大小
  2. 然后乘以需要的个数即可得出总大小
  3. 注意:malloc不会对数组进行初始化,返回的结果是一个指针,即指向所分配的动态数组的指针,这个指针是无类型的,因此一定要将数据类型强制转换为当前类型的指针,并赋值回去~

此外还需要注意的是,使用后要用free函数释放空间,并将指针变换为空指针~


接下来通过一段代码演示一下:

int main(int argc, char *argv[]) {
	int* arr1;
	arr1=(int*)malloc(10*sizeof(int));
	int i=0,j=0;
	for(;i<10;i++)
	{
		if(arr1!=NULL)
			*(arr1+i)=2;
	}
	for(;j<10;j++)
		printf("%d ",*(arr1+j));
}

运行结果没什么问题,10个2:

再升级一下:一方面长度可以用户自定义,另一方面数值也可以自定义;同时,还加入了使用后销毁的过程:

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char *argv[]) {
	
	int* arr1;  //指向数组的指针 
	
	int num=0,temp=0;

	printf("请输入数组长度:\n");
	scanf("%d",&num); 
	
	arr1=(int*)malloc(num*sizeof(int)); //开辟空间,并将地址返回给指针
	
	int i=0,j=0;
	
	for(;i<=num-1;i++)
		if(arr1!=NULL){
			printf("此时输入的是%d位上的元素:\n",i);
			scanf("%d",&temp);
			*(arr1+i)=temp;
		}		
	
	for(;j<=num-1;j++)
		printf("%d ",*(arr1+j));
	
	free(arr1);
	arr1=NULL;
	return 0;
}

十分完美:

三.耍赖的玩法 

如果各位觉得malloc比较麻烦,这里还有一种玩赖的写法:
 

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char *argv[]) {
	
	int num=0,i=0,j=0;
	int temp=0;
	
	printf("请输入数组长度:\n");
	scanf("%d",&num); 
	
	
	int arr[num];
	
	for(;i<=num-1;i++)
	{
		scanf("%d",&temp);
		arr[i]=temp;
	}
	for(;j<=num-1;j++)
		printf("%d ", arr[j]);
		
	return 0;
}

没什么问题:

说真的,博主以前以为只有C++可以这样做,属于是长见识了。。。。 

二.C++

其实C的第三种是在C++中常用的。除了这种方式,博主最偏爱的就是struct混合vector的方式,效果拔群,这里不再赘述:

C++STL模板库——vector容器(上)-CSDN博客

C++模板库STL——vector容器(下)-CSDN博客

三.伪码误导

博主最近一直在看的基本书,有些地方的伪码误导性较强,这里说一下

1.算法笔记

int[] A绝对是大错特错的写法,相信大家都知道不能不声明数组长度~ 

此外就是预处理的过程,建议数组都赋0处理,避免脏数据对答案造成影响,不建议像上面这样直接赋值~

2.王道考研

倒没什么大的问题 ,就是对于小白不太友好:LNode *s,按照大一学C语言的惯性思维,会很想当然地将*s看做变量名,而LNode是变量类型。事实上,大家都知道,这里的S是一个LNode类型的指针~

建议大家平时在编码时,写成LNode* S,这样会一目了然S是LNode*类型的变量。


目前就发现这么多,日后继续总结,细节决定成败,对于408来说写伪码没什么太大问题,对于编程语言的考试一定要格外注意语法规范!

相关推荐

  1. [C语言] 使用数组模拟实现malloc

    2024-07-20 01:14:05       48 阅读
  2. C# 数据结构初始化长度

    2024-07-20 01:14:05       32 阅读
  3. C语言面试指针辨析

    2024-07-20 01:14:05       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 01:14:05       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 01:14:05       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 01:14:05       45 阅读
  4. Python语言-面向对象

    2024-07-20 01:14:05       55 阅读

热门阅读

  1. 197.上升的温度

    2024-07-20 01:14:05       19 阅读
  2. Openlayers特殊效果

    2024-07-20 01:14:05       15 阅读
  3. __setitem__

    2024-07-20 01:14:05       16 阅读
  4. sklearn基础教程:从入门到精通

    2024-07-20 01:14:05       16 阅读
  5. 翁恺-C语言程序设计-11-0. 平面向量加法

    2024-07-20 01:14:05       19 阅读
  6. 什么是ZAB协议?

    2024-07-20 01:14:05       13 阅读
  7. 驱动开发系列04-中断处理

    2024-07-20 01:14:05       19 阅读