首页 > 技术文章 > 【项目1_电子书】第3课、3.4节_电子书之链表操作

xiaohujian 2019-09-04 21:56 原文

主 机:VMWare--Ubuntu-16.04.2-x64-100ask
开发板:Mini2440--256M NandFlash,   2M NorFlash,   64M SDRAM,   LCD-TD35;
    bootlorder:u-boot1.16,      Kernel:4.3.2;
编译器:arm-linux-gcc-4.3.2


 

一、问题及解决
1、void add_one_name()
{
PT_Name ptNew;
char *str;
char name[128];

printf("enter the name:");
scanf("%s", name);

str = malloc(strlen(name) + 1);
strcpy(str, name);

ptNew = malloc(sizeof(T_Name));
ptNew->name = str;
ptNew->pre = NULL;
ptNew->next = NULL;

add_name(ptNew);
}
问题1:为什么要有char *str; char name[128];两个变量,只保留一个str 或 name[128]可否?str 或 name[128] 的特殊意义?
猜测与推论1:name[128]代表一个struct NAME结构体的名字,用常变量是为了限定名字长度,避免无限输入吗?
猜测与推论2:用malloc来动态分配ptNew->name变量的空间,可以最大节约内存空间。malloc分配的空间并不随着(局部)函数的调用结束而清除,
必须使用free()函数才可释放该空间。
在del_one_name()函数内部可使用free()来释放某节点的内存空间。

结论:需要两个都用。

VC++6.0测试程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char name[20] = "name1";
char name2[20];
char *str;

/* 二、测试*/
printf("name=%s, strlen(name) = %d\n", name, strlen(name));
printf("name2=%s, strlen(name2) = %d\n", name2, strlen(name2));
str = (char *)malloc(strlen(name) + 1);
printf("str=%s, strlen(str) = %d\n", str, strlen(str));
strcpy(str, name);
printf("str=%s, strlen(str) = %d\n", str, strlen(str));

return 0;
}
/*
打印结果是:
name=name1, strlen(name) = 5
name2=烫烫烫烫烫烫烫烫烫烫name1, strlen(name2) = 25
str=屯屯屯葺葺葺萀..G? strlen(str) = 22
str=name1, strlen(str) = 5
Press any key to continue
*/


2、对于不知道的宏、函数等的头文件的查找和包含方法
答:
$ ehco $PATH
...:/usr/local/arm/4.3.2/bin //工具链地址;
$ cd /usr/local/arm/4.3.2/ //进入工具链,bin目录的上一层;
$ grep "FBIOGET_VSCREENINFO" * -nR //在工具链搜索该宏的定义包含位置;在某个头文件一定定义了该宏;(查询时间稍长)
.../libc/usr/include/linux/fb.h: 16:#define FBIOGET_VSCREENINFO 0x4600
因此,在文件中包含#include <linux/fb.h>即可。

 

推荐阅读