前面有生篇文章“给二级指针分配空间”,分配的空间有点问题,不连续,正确的分配方法如下面的例子。以下例子实现的功能是:把文件当中的每一行读到一个数组中的一个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;
}
分享到:
相关推荐
通过了解变量是如何在计算机内存中分配空间的,可以更好地理解指针的工作原理。 - **2. 赋值给变量**:接下来讲解了如何通过赋值操作符将值赋给变量,以及这种操作背后所发生的内存变化。 - **3. 变量在哪里?**:...
在准备二级计算机考试中,对C语言的深入理解和熟练掌握至关重要。 这份"二级必备资料"涵盖了C语言的核心知识点,包括但不限于以下部分: 1. **基础语法**:C语言的基础始于变量、数据类型(如int、char、float等)...
根据提供的文件信息,以下是详细的知识点梳理: 1. C++基础语法: - 关键字和语法结构,如`const`用于...由于文档内容的OCR扫描可能存在不准确或遗漏,部分知识点可能需要参考官方教材或文档进行更精确的理解和补充。
- **4.3.3 计算常数е的值**:给出了计算自然对数底e的一个程序实例。 **4.4 转向语句** - **4.4.1 转向语句**:讲解了break和continue语句的使用。 **4.5 数据导出类型,数组(Array)** - **4.5.1 导出类型的...
理解指针的使用、指针变量的声明、指针运算以及动态内存分配(如`malloc`、`calloc`、`realloc`、`free`)是掌握C语言的关键。 2. **结构体与联合体**: 结构体允许将不同类型的数据组合成一个整体,便于数据组织...
例如,如果有一个函数 `void func(int arr[])`,当我们调用 `func(myArray)` 时,myArray 的首地址会被传递给函数 func,而函数内部可以通过指针操作来遍历整个数组。 ### 2. 方法重写的前提条件 **知识点概述:**...
定义则是确定对象类型并分配存储空间的特殊声明,程序中只能出现一次。在声明时有一些限制,例如函数的返回值不能是函数或数组,数组中不能包含函数。合法的声明可以是函数指针的返回值,或者指向数组的指针。 ####...
`c1`是一个对象,`c2`是一个指向`MyClass`类型的指针,`c3`是通过`new`关键字动态分配的`MyClass`对象的指针,而`c4`是`MyClass`类型的引用,指向`c1`。 2. 类成员的访问权限 - `class XX {private: double x1; ...
在实现栈和队列时,可以用数组或动态分配的内存空间。对于树和图,C语言同样需要通过指针来构造和操作它们的节点。 PPT可能还会涉及算法,如排序(冒泡、选择、插入、快速、归并等)和查找(顺序、二分、哈希等)。...
12_二级指针做输入_第2种内存模型_课堂答疑_多维数组名本质抛砖 13_二级指针做输入_第3种内存模型_传智扫地僧 14_二级指针三种内存模型示意图_传智扫地僧 15_玩转多级指针_传智扫地僧 16_两个辅助指针变量挖字符串...
- **指针和动态内存分配**:通过指针可以动态地分配和释放内存空间,这对于处理大小不确定的数据结构非常有用。 - **命令行参数**:在程序启动时可以通过命令行传递参数给程序,这些参数可以通过特定的机制获取并在...
二、指针与内存管理 指针是C语言的一个重要特性,它允许我们直接操作内存。在练习题中,你可能会遇到如何声明和使用指针,理解指针变量的值(即内存地址),以及通过指针进行数组、字符串或结构体的操作。此外,内存...
当多个客户端请求同一个Servlet时,并不是为每个客户端启动一个新的进程,而是通常在一个线程池中分配线程来处理请求。这样可以更高效地利用资源。 ### 12. VB数据类型 在Visual Basic中,`Byte`类型占用的内存最少...
6. **内存管理**:介绍动态内存分配(malloc, free)以及如何有效管理程序的内存空间。 7. **结构体与联合体**:讨论如何使用结构体和联合体来组合不同类型的数据,以及在结构体中使用指针的技巧。 8. **预处理器*...
位运算在底层编程和优化中常见,PPT可能会介绍位运算符的用法,如按位与(&)、按位或(|)、按位异或(^)、左移()和右移(>>)等,以及它们在处理二进制数据和节省内存空间上的应用。 错误处理是确保程序健壮性的重要环节...
- 函数参数与返回值:掌握如何传递参数给函数,处理函数返回值,以及理解不同类型的参数传递方式(传值和传址)。 3. **数组与指针** - 数组:学习一维、二维数组的声明、初始化和操作,以及数组在内存中的存储...