有关指针的指针的问题

madasoft 2003-08-20 10:12:57
问题:
从文件中读取几个字符赋给char *类型变量。
然后,将char *类型变量的地址赋给char **类型变量。
我想输出char **类型变量的内容,但是在运行printf时出错。
编译器:gcc
出错信息:Segmentation fault

请各位大虾不吝指教,严重感谢。

测试程序如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE * fd;
char * data1,*data2;
char * t1,*t2;
char **pp;

data1=(char *)malloc(sizeof(char)*10);
data2=(char *)malloc(sizeof(char)*10);

fd=fopen("./fu","rb");
if(fd==NULL) return -1 ;

fread(data1,sizeof(char),5,fd);
fread(data2,sizeof(char),5,fd);

strcpy(t1,data1);
strcpy(t2,data2);

// printf("tt address is %p\n",t1); //1
// printf("tt address is %p\n",t2); //2

pp=(char **)malloc(sizeof(char *)*2);
*pp++=t1;
*pp=t2;
pp--;

printf("value of pp is %x\n",*pp++); //1
printf("value of pp is %x\n",*pp); //2
pp--;

// printf("pp 1 is %s\n",**pp++); //出错
// printf("pp 2 is %s\n",**pp); //出错

free(data1);
free(data2);
free(pp);
fclose(fd);
return 0;
}

要运行的话你需要自己写一个文件,填入多于10个字符,我上面没有文件操作的
容错处理。
...全文
35 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dragon132 2003-08-20
  • 打赏
  • 举报
回复
有一点是,但我认为最重要的是要有一个好的编译软件
虽然我们做的是Tc但是我用的是C++的编译器,这里有几点好处:
windows操作简单
变量跟踪方便尤其是在查错中特别好用
madasoft 2003-08-20
  • 打赏
  • 举报
回复
Dragon132(Dragon):
非常感谢!我马上结账 :)
但还想问一个问题:
如果再遇到类似的问题,应该用什么方法调试比较好呢?
你是根据经验吗?
Dragon132 2003-08-20
  • 打赏
  • 举报
回复
fread(data1,sizeof(char),5,fd);
fread(data2,sizeof(char),5,fd);
data1[5]='\0';
data2[5]='\0'; //读取完字符串后要加结束标志
t1=data1;
t2=data2;
jscsqb 2003-08-20
  • 打赏
  • 举报
回复
建议逐一读取*pp指向的字符,而不是一次读取整个字符串。
madasoft 2003-08-20
  • 打赏
  • 举报
回复
zhang1000(多一个零):
**pp不是单个字符。如果不是从文件中读取,而直接赋字符串是可以的,问题的关键在于,是从文件中读取字符出现错误。
Dragon132 2003-08-20
  • 打赏
  • 举报
回复
我已经改好了,你看看吧

#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE * fd;
char * data1,*data2;
char * t1,*t2;
char **pp;

data1=(char *)malloc(sizeof(char)*10);
data2=(char *)malloc(sizeof(char)*10);

fd=fopen("exam.dat","rb");
if(fd==NULL) return -1 ;

fread(data1,sizeof(char),5,fd);
fread(data2,sizeof(char),5,fd);
data1[5]='\0';
data2[5]='\0';
t1=data1;
t2=data2;

printf("tt address is %p\n",t1); //1
printf("tt address is %p\n",t2); //2

pp=(char **)malloc(sizeof(char *)*2);
*pp++=t1;
*pp=t2;
pp--;

printf("value of pp is %x\n",*pp++); //1
printf("value of pp is %x\n",*pp); //2
pp--;

printf("pp 1 is %s\n",*pp++); //³ö´í
printf("pp 2 is %s\n",*pp); //³ö´í
pp--;
free(data1);
free(data2);
free(pp);
fclose(fd);
return 0;
}
madasoft 2003-08-20
  • 打赏
  • 举报
回复
Dragon132(Dragon),这样用是不对,但这不是程序出错的致命原因。
请继续帮我找找原因,先谢了。
zhang1000 2003-08-20
  • 打赏
  • 举报
回复
printf("pp 1 is %s\n",**pp++); //出错
printf("pp 2 is %s\n",**pp); //出错
**pp是单个字符,怎么能用%s??
Dragon132 2003-08-20
  • 打赏
  • 举报
回复

strcpy(t1,data1);
strcpy(t2,data2);
t1 t2 没有分配空间怎么能用这个函数呢直接
t1=data1 t2=data2 就行啦!
t1 t2只是指针而矣

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧