`
pipal
  • 浏览: 163652 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

补充:给二级指针分配空间

 
阅读更多
前面有生篇文章“给二级指针分配空间”,分配的空间有点问题,不连续,正确的分配方法如下面的例子。以下例子实现的功能是:把文件当中的每一行读到一个数组中的一个char*里面。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef	_WORDSLEN_
#define WORDSLEN 32
#endif

#define PRINTERR(errMsg)	printf("error:%s",errMsg)
#define FREEIF(ptr)		{if (ptr) free(ptr);}
#define CLOSEIF(fptr)		{if (fptr)	fclose(fptr);}

int load2Var(char *filename, char arr[][WORDSLEN])
{
	FILE *fin = NULL;
	char *text = NULL;	//the content of the file text
	char *ptr;
	int textLen = 0;
	int i = 0;
	char *delim  = "\n ";

	if (!(fin = fopen(filename,"r")))
	{
		PRINTERR("filename\n");
		return -3;
	}

	fseek (fin,0L,SEEK_END);
	textLen = ftell (fin);
	fseek (fin,0L,SEEK_SET);

	do
	{
		if (!(text = (char *)calloc(textLen+1,sizeof(char))))
		{
			PRINTERR("calloc\n");
			break;
		}

		fread(text,textLen,1,fin);

		ptr = (char *)strtok(text,delim);		
		while (ptr)
		{			
			strcpy(arr[i], ptr);		
			ptr=(char *)strtok(NULL,delim);
			i++;
		}

	}while(0);

	FREEIF(text);
	CLOSEIF(fin);
	return i;
}

int main(int argc, char **argv)
{
	int len = 0, i = 0;	
	char **myarr = NULL;

	
	if (!(myarr = (char **)malloc(WORDSLEN*sizeof(char *))))
	{
		printf("malloc myarr err");
		return -1;
	}
	*myarr = (char *)malloc(sizeof(char) * WORDSLEN * WORDSLEN);
	if (myarr[0] == NULL)
	{
		return -2;
	}
	for (i = 0; i < WORDSLEN; i++)
	{
		myarr[i] = (char *)myarr[0] + WORDSLEN * i;
	}

	memset(myarr[0],0,WORDSLEN*WORDSLEN);

	len = load2Var("input.txt", *myarr);

	printf("Len=%d\n",len);

	for (i = 0; i < WORDSLEN; i++)
	{
		if (strlen(myarr[i]) > 0)
			printf("%s \n", myarr[i]);
	}

	FREEIF(*myarr);

	FREEIF(myarr);

	return 0;
}
0
0
分享到:
评论

相关推荐

    传智播客扫地僧视频讲义源码

    12_二级指针做输入_第2种内存模型_课堂答疑_多维数组名本质抛砖 13_二级指针做输入_第3种内存模型_传智扫地僧 14_二级指针三种内存模型示意图_传智扫地僧 15_玩转多级指针_传智扫地僧 16_两个辅助指针变量挖字符串...

    C++大学教程,一本适合初学者的入门教材(part1)

    第21章 ANSI/ISO C++标准语言补充 21.1 简介 21.2 bool数据类型 21.3 static—cast运算符 21.4 const—cast运算符 21.5 reinterpret—cast运算符 21.6 名字空间 21.7 运行时类型信息(RTTI) 21.8 运算符...

    C++大学教程,一本适合初学者的入门教材(part2)

    第21章 ANSI/ISO C++标准语言补充 21.1 简介 21.2 bool数据类型 21.3 static—cast运算符 21.4 const—cast运算符 21.5 reinterpret—cast运算符 21.6 名字空间 21.7 运行时类型信息(RTTI) 21.8 运算符...

    用C编写班级成绩管理系统

    二、功能要求: 1、本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。 2、本系统显示这样的菜单: 请选择系统功能项: a、 成绩录入 b、 成绩显示 c、 成绩保存 d、 成绩排序 e、 成绩...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    硬盘空间:10GB  安装 1. 安装程序成功下载,将会得到如下2个文件: 解压文件将得到database文件夹,文件组织如下: 点击setup.exe执行安装程序,开始安装。 2. 点击安装程序将会出现如下安装界面,步骤 1/9:...

    C++程序设计彻底研究(是code不是书)

    21.2 补充几个类使用上的要点 21.3 使用成员函数重载二元运算符 21.4 使用friend函数重载二元运算符 21.5 重载一元运算符 21.6 含有指针数据成员的类 21.7 等效阻抗的计算 21.8 常犯的错误 21.9 本章重点 ...

    Visual C++ 2005入门经典--源代码及课后练习答案

    5.2.2 给函数传递指针实参 218 5.2.3 给函数传递数组 219 5.2.4 给函数传递引用实参 224 5.2.5 使用const修饰符 226 5.2.6 main()函数的实参 227 5.2.7 接受数量不定的函数实参 229 5.3 从函数返回值 ...

    rfc中文文档目录,包含部分翻译

    RFC405 给 TIP 用户的第二封信 RFC456 UCSB 的数据重置服务 RFC457_FTP 的服务器与服务器交互 RFC496 IMP/TIP 内存更新时间表(修订版 2) RFC516 丢失消息的检测 RFC591 在 NVT ASCII UCSB和在线系统之间的实验...

    Keil C51语言使用技巧及实战, (带书签pdf, 阅读起来就是爽,不是精品我不发)

    第二章 用 C 对 8051 编程 1 为什么要用高级语言 2 C 语言的一些要点 2.1 结构 2.2 联合 2.3 指针 2.4 类型定义 3 Keil C和ANSI C 3.1 数据类型 3.2 特殊功能寄存器 4 存储类型 4.1 DATA 区 4.2 BDATA区 4.3 IDATA段...

    中文版RFC,共456

    RFC405 给 TIP 用户的第二封信 RFC456 UCSB 的数据重置服务 RFC457 FTP 的服务器与服务器交互 RFC496 IMP/TIP 内存更新时间表(修订版 2) RFC516 丢失消息的检测 RFC591 在 NVT ASCII UCSB和在线系统之间的实验输入...

    RFC中文文档-txt

    RFC405 给 TIP 用户的第二封信 RFC456 UCSB 的数据重置服务 RFC457 FTP 的服务器与服务器交互 RFC496 IMP/TIP 内存更新时间表(修订版 2) RFC516 丢失消息的检测 RFC591 在 NVT ASCII UCSB和在线系统之间的实验输入...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    5.2.2 给函数传递指针实参 217 5.2.3 给函数传递数组 219 5.2.4 给函数传递引用实参 222 5.2.5 使用const修饰符 224 5.2.6 rvalue引用形参 225 5.2.7 main()函数的实参 227 5.2.8 接受数量不定的函数实参 229...

    用c描述的数据结构演示软件

    此时也可直接单击一级菜单或二级菜单的标题直接返回之,注意:菜单右侧上方的“退出”按钮意为退出整个演示课件。 2. 算法演示执行状态下的屏幕分为三部分:第一行为“标题行”,第二行为“菜单命令”,以下为算法...

    数据结构演示软件

    此时也可直接单击一级菜单或二级菜单的标题直接返回之,注意:菜单右侧上方的“退出”按钮意为退出整个演示课件。 2. 算法演示执行状态下的屏幕分为三部分:第一行为“标题行”,第二行为“菜单命令”,以下为算法...

    windows驱动开发技术详解-part2

     本书适用于中、高级系统程序员,同时也可用做高校计算机专业操作系统实验课的补充教材。 原创经典,威盛一线工程师倾力打造。深入驱动核心,剖析操作系统底层运行机制,通过实例引导,快 速学习编译、安装、调试...

    Windows驱动开发技术详解的光盘-part1

     本书适用于中、高级系统程序员,同时也可用做高校计算机专业操作系统实验课的补充教材。 原创经典,威盛一线工程师倾力打造。深入驱动核心,剖析操作系统底层运行机制,通过实例引导,快速学习编译、安装、调试的...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目源代码

    Java访问权限控制源代码 1个目标文件 摘要:Java源码,文件操作,权限控制 Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流...

Global site tag (gtag.js) - Google Analytics