`
pipal
  • 浏览: 166742 次
  • 性别: 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
分享到:
评论

相关推荐

    彻底搞定C指针(完全版·修订增补版)

    通过了解变量是如何在计算机内存中分配空间的,可以更好地理解指针的工作原理。 - **2. 赋值给变量**:接下来讲解了如何通过赋值操作符将值赋给变量,以及这种操作背后所发生的内存变化。 - **3. 变量在哪里?**:...

    C程序设计,二级必备资料

    在准备二级计算机考试中,对C语言的深入理解和熟练掌握至关重要。 这份"二级必备资料"涵盖了C语言的核心知识点,包括但不限于以下部分: 1. **基础语法**:C语言的基础始于变量、数据类型(如int、char、float等)...

    九月全国计算机等级考试二级C++试题.pdf

    根据提供的文件信息,以下是详细的知识点梳理: 1. C++基础语法: - 关键字和语法结构,如`const`用于...由于文档内容的OCR扫描可能存在不准确或遗漏,部分知识点可能需要参考官方教材或文档进行更精确的理解和补充。

    高级语言C++程序设计

    - **4.3.3 计算常数е的值**:给出了计算自然对数底e的一个程序实例。 **4.4 转向语句** - **4.4.1 转向语句**:讲解了break和continue语句的使用。 **4.5 数据导出类型,数组(Array)** - **4.5.1 导出类型的...

    C语言补充知识点归纳.zip

    理解指针的使用、指针变量的声明、指针运算以及动态内存分配(如`malloc`、`calloc`、`realloc`、`free`)是掌握C语言的关键。 2. **结构体与联合体**: 结构体允许将不同类型的数据组合成一个整体,便于数据组织...

    2021-2022计算机二级等级考试试题及答案No.1966.docx

    例如,如果有一个函数 `void func(int arr[])`,当我们调用 `func(myArray)` 时,myArray 的首地址会被传递给函数 func,而函数内部可以通过指针操作来遍历整个数组。 ### 2. 方法重写的前提条件 **知识点概述:**...

    c知识框架第二版

    定义则是确定对象类型并分配存储空间的特殊声明,程序中只能出现一次。在声明时有一些限制,例如函数的返回值不能是函数或数组,数组中不能包含函数。合法的声明可以是函数指针的返回值,或者指向数组的指针。 ####...

    三月计算机等级考试二级C笔试试题一.pdf

    `c1`是一个对象,`c2`是一个指向`MyClass`类型的指针,`c3`是通过`new`关键字动态分配的`MyClass`对象的指针,而`c4`是`MyClass`类型的引用,指向`c1`。 2. 类成员的访问权限 - `class XX {private: double x1; ...

    数据结构c语言补充.zip

    在实现栈和队列时,可以用数组或动态分配的内存空间。对于树和图,C语言同样需要通过指针来构造和操作它们的节点。 PPT可能还会涉及算法,如排序(冒泡、选择、插入、快速、归并等)和查找(顺序、二分、哈希等)。...

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

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

    程序设计实习(田永鸿)清华大学

    - **指针和动态内存分配**:通过指针可以动态地分配和释放内存空间,这对于处理大小不确定的数据结构非常有用。 - **命令行参数**:在程序启动时可以通过命令行传递参数给程序,这些参数可以通过特定的机制获取并在...

    C语言-2022秋-补充练习题及答案.rar

    二、指针与内存管理 指针是C语言的一个重要特性,它允许我们直接操作内存。在练习题中,你可能会遇到如何声明和使用指针,理解指针变量的值(即内存地址),以及通过指针进行数组、字符串或结构体的操作。此外,内存...

    2021-2022计算机二级等级考试试题及答案No.4010.docx

    当多个客户端请求同一个Servlet时,并不是为每个客户端启动一个新的进程,而是通常在一个线程池中分配线程来处理请求。这样可以更高效地利用资源。 ### 12. VB数据类型 在Visual Basic中,`Byte`类型占用的内存最少...

    C语言程序设计完整视频 课件+源代码.zip

    6. **内存管理**:介绍动态内存分配(malloc, free)以及如何有效管理程序的内存空间。 7. **结构体与联合体**:讨论如何使用结构体和联合体来组合不同类型的数据,以及在结构体中使用指针的技巧。 8. **预处理器*...

    北大c语言高级编程PPT

    位运算在底层编程和优化中常见,PPT可能会介绍位运算符的用法,如按位与(&)、按位或(|)、按位异或(^)、左移()和右移(&gt;&gt;)等,以及它们在处理二进制数据和节省内存空间上的应用。 错误处理是确保程序健壮性的重要环节...

    历届C语言上海市等级试题及参考答案

    - 函数参数与返回值:掌握如何传递参数给函数,处理函数返回值,以及理解不同类型的参数传递方式(传值和传址)。 3. **数组与指针** - 数组:学习一维、二维数组的声明、初始化和操作,以及数组在内存中的存储...

Global site tag (gtag.js) - Google Analytics