关于指针问题,编译通过

陈思有 2012-02-19 03:54:57
#include <stdio.h>
#include <stdlib.h>
#include "hansu.h"
#include "SqList.h"

void main()
{
sqList *L;
int n; //用来存储返回的数值

n = InitList( L );

if (n == 1)
{
printf("线性表构建失败\n");
}
else
{
printf("lenth=%d\nlistSize=%d\n",L->lenth,L->listSize);
free(L->elem); //释放给数组分配的内存
}
}


执行的时候发生错误,是我是在InitList函数给L分配内存的,难道要在传递L之前给L初始化?
...全文
189 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yht8708 2012-02-20
  • 打赏
  • 举报
回复
if (!L->elem)
{
printf("分配内存失败");
return(1);
}

应该是这样吧.

如果没有初始化,那指针就没有地址,也就谈不上传值。不知道可不可以这样理解
赵4老师 2012-02-20
  • 打赏
  • 举报
回复
参考理解并练习一下?
//将c:\\tmp文件夹下的所有文件的内容全部放到用malloc分配的内存中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
struct FB {
char fn[256];
size_t fl;
char *b;
struct FB *next;
struct FB *prev;
} *fh,*fb,*ft;
char ln[256];
char fpn[256];
FILE *af;
FILE *f;
int L,n;
int main() {
system("dir /b /a-d c:\\tmp\\*.* >c:\\allfn.txt");
af=fopen("c:\\allfn.txt","r");
if (NULL==af) {
printf("Can not open file c:\\allfn.txt!\n");
return 1;
}
fh=NULL;
fb=NULL;
n=0;
while (1) {
if (NULL==fgets(ln,256,af)) break;
L=strlen(ln);
if ('\n'==ln[L-1]) ln[L-1]=0;
printf("read %s\n",ln);
strcpy(fpn,"c:\\tmp\\");
strcat(fpn,ln);
ft=(struct FB *)malloc(sizeof(struct FB));
if (NULL==ft) {
printf("Can not malloc ft!\n");
fclose(af);
return 2;//之前的malloc在main退出后由操作系统自动free
}
printf("ft[%d]==%p\n",n,ft);
strcpy(ft->fn,fpn);
f=fopen(fpn,"rb");
if (NULL==f) {
printf("Can not open file %s!\n",fpn);
fclose(af);
return 3;//之前的malloc在main退出后由操作系统自动free
}
ft->fl=_filelength(fileno(f));
ft->b=malloc(ft->fl);
if (NULL==ft->b) {
printf("Can not malloc ft->b!\n");
fclose(f);
fclose(af);
return 4;//之前的malloc在main退出后由操作系统自动free
}
printf("ft[%d]->b==%p\n",n,ft->b);
if (ft->fl!=fread(ft->b,1,ft->fl,f)) {
printf("fread error!\n");
fclose(f);
fclose(af);
return 5;//之前的malloc在main退出后由操作系统自动free
}
fclose(f);
ft->next=NULL;

if (NULL==fh) {
ft->prev=NULL;
fh=ft;
} else {
fb->next=ft;
ft->prev=fb;
}
fb=ft;
n++;
}
fclose(af);
printf("-----list-----\n");
for (ft=fh;NULL!=ft;ft=ft->next) {
printf("%8d %s\n",ft->fl,ft->fn);
if (NULL!=ft) fb=ft;
}
printf("-----free-----\n");
n--;
if (NULL!=fh) {
for (ft=fb->prev;NULL!=ft;ft=ft->prev) {
if (NULL!=ft->next->b) {
printf("ft[%d]->b==%p\n",n,ft->next->b);
free(ft->next->b);
}
if (NULL!=ft->next) {
printf("ft[%d]==%p\n",n,ft->next);
free(ft->next);
}
n--;
}
if (NULL!=fh->b) {
printf("ft[0]->b==%p\n",fh->b);
free(fh->b);
}
printf("ft[0]==%p\n",fh);
free(fh);
}
return 0;
}
//C:\tmp\tmp\Debug>dir /a-d c:\tmp
// 驱动器 C 中的卷是 C_HD5_1
// 卷的序列号是 1817-D526
//
// c:\tmp 的目录
//
//找不到文件
//
//C:\tmp\tmp\Debug>tmp
//找不到文件
//-----list-----
//-----free-----
//
//C:\tmp\tmp\Debug>dir /a-d c:\tmp
// 驱动器 C 中的卷是 C_HD5_1
// 卷的序列号是 1817-D526
//
// c:\tmp 的目录
//
//2011-06-30 18:04 44,840 my_c.rar
//2011-06-30 17:18 1,036 err.frm
//2011-06-30 14:32 14,243 出租.txt
//2011-06-28 12:08 23,681 MSDN98书签.txt
// 4 个文件 83,800 字节
// 0 个目录 17,041,870,848 可用字节
//
//C:\tmp\tmp\Debug>tmp
//read my_c.rar
//ft[0]==00421800
//ft[0]->b==00520068
//read err.frm
//ft[1]==00421670
//ft[1]->b==0052AFC0
//read 出租.txt
//ft[2]==00421530
//ft[2]->b==00378F28
//read MSDN98书签.txt
//ft[3]==004213F0
//ft[3]->b==0052B3F8
//-----list-----
// 44840 c:\tmp\my_c.rar
// 1036 c:\tmp\err.frm
// 14243 c:\tmp\出租.txt
// 23681 c:\tmp\MSDN98书签.txt
//-----free-----
//ft[3]->b==0052B3F8
//ft[3]==004213F0
//ft[2]->b==00378F28
//ft[2]==00421530
//ft[1]->b==0052AFC0
//ft[1]==00421670
//ft[0]->b==00520068
//ft[0]==00421800
//
//C:\tmp\tmp\Debug>
leo_dengzx 2012-02-20
  • 打赏
  • 举报
回复
这一行有问题:
L->elem = (ElemType *)malloc(sizeof(ElemType)*FIRST_LENTH);//开始分配内存;

L传进来之前,只是有定义,没有空间可用。一般是空指针或者野指针,此时去访问其成员,自然会有异常。
whc748227431 2012-02-20
  • 打赏
  • 举报
回复
建议楼主定义指针时先赋空值,
最后free()释放内存后也赋个空值,
因为free()释放内存但是没有把指针干掉
cao_julians 2012-02-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 csiyou 的回复:]
我刚才写了比较简单的一个程序,当我不对指针进行初始化就作为参数传递,或者随便给指针一个数,然后作为参数传递,结果都出现了这种问题。所以,我的问题是指针如果没有初始化就作为参数传递的话,就会出问题吗?
[/Quote]
是否出问题取决于用这个指针干什么?如果只是读值作为随机数,只要操作系统允许当然中不会出问题的
陈思有 2012-02-19
  • 打赏
  • 举报
回复
我刚才写了比较简单的一个程序,当我不对指针进行初始化就作为参数传递,或者随便给指针一个数,然后作为参数传递,结果都出现了这种问题。所以,我的问题是指针如果没有初始化就作为参数传递的话,就会出问题吗?
陈思有 2012-02-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cao_julians 的回复:]
引用 5 楼 redshiliu 的回复:
这样不行,你InitList里面malloc出来的指针只是赋值给了函数内部的变量L
不会影响到main里面的那个L(C默认都是传值进来的)
可以这样

C/C++ code


int Init(sqList **LP)
{
sqList *tp=(...)malloc(...);
...
*LP=tp;
}

//main……
[/Quote]


我是这样想的,即使我原先没有对L赋值,它指向的是一个不确定的地址,当我把它作为一个实参传递的时候,那个形参所指向的地址是和实参一样的,虽然我不知道这个地址在哪里
陈思有 2012-02-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cao_julians 的回复:]
引用 5 楼 redshiliu 的回复:
这样不行,你InitList里面malloc出来的指针只是赋值给了函数内部的变量L
不会影响到main里面的那个L(C默认都是传值进来的)
可以这样

C/C++ code


int Init(sqList **LP)
{
sqList *tp=(...)malloc(...);
...
*LP=tp;
}

//main……
[/Quote]

我在InitList函数直接输出的话,执行时遇到的问题也一样
bluesnail1986 2012-02-19
  • 打赏
  • 举报
回复
调用InitList函数前L是NULL,实际上根本就没传进去什么东西。这种情况下,要不用二级指针,要不就在初始化之前就malloc...
楼主犯的错误面试经常会考的,呵呵...
如此美丽的你 2012-02-19
  • 打赏
  • 举报
回复
#include <stdio.h> 
#include <stdlib.h> #include "hansu.h" #include "SqList.h"sqList *L; void main() { int n; //用来存储返回的数值 n = InitList(); if (n == 1) { printf("线性表构建失败\n"); } else { printf("lenth=%d\nlistSize=%d\n",L->lenth,L->listSize); free(L->elem); //释放给数组分配的内存 } }
cao_julians 2012-02-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 redshiliu 的回复:]
这样不行,你InitList里面malloc出来的指针只是赋值给了函数内部的变量L
不会影响到main里面的那个L(C默认都是传值进来的)
可以这样

C/C++ code


int Init(sqList **LP)
{
sqList *tp=(...)malloc(...);
...
*LP=tp;
}

//main里调用修改为
int……
[/Quote]
++
lz只将函数的形参L指向了malloc()分配的空间,而InitList函数返回值又与L没有关系,这样是无法将L指向的空间传递给其它函数的!
想将形参L的指向空间传递给其它函数,有两种方法:
1.return L;//传递给调用函数
2.形参声明为sqList **L,传递实参为&L,在InitList函数中对*L进行malloc调用
redshiliu 2012-02-19
  • 打赏
  • 举报
回复
你指针声明后未初始化是可以作为参数传进函数,
但是如果你想要在函数内修改你声明的指针就必须
将函数参数声明为指针的指针才能实现。
陈思有 2012-02-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 redshiliu 的回复:]
这样不行,你InitList里面malloc出来的指针只是赋值给了函数内部的变量L
不会影响到main里面的那个L(C默认都是传值进来的)
可以这样

C/C++ code

int Init(sqList **LP)
{
sqList *tp=(...)malloc(...);
...
*LP=tp;
}
//main里调用修改为
int n……
[/Quote]
我传递的是指针,是没有问题的;问题在于,是不是未对指针初始化之前,不能使用指针,连做实参都不行

redshiliu 2012-02-19
  • 打赏
  • 举报
回复
这样不行,你InitList里面malloc出来的指针只是赋值给了函数内部的变量L
不会影响到main里面的那个L(C默认都是传值进来的)
可以这样

int Init(sqList **LP)
{
sqList *tp=(...)malloc(...);
...
*LP=tp;
}

//main里调用修改为
int n=Init(&L);

陈思有 2012-02-19
  • 打赏
  • 举报
回复
int InitList(sqList *L)
{
L->elem = (ElemType *)malloc(sizeof(ElemType)*FIRST_LENTH);//开始分配内存;
if (L->elem)
{
printf("分配内存失败");
return(1);
}

L->listSize = FIRST_LENTH; //线性表的长度
L->lenth = 0; //此时的线性表没有任何的数据

printf("lenth=%d\nlistSize=%d\n",L->lenth,L->listSize);

return 0;
}
Gloveing 2012-02-19
  • 打赏
  • 举报
回复
sqList *L = new sqList;
redshiliu 2012-02-19
  • 打赏
  • 举报
回复
把你的代码弄全阿,不知道你InitList怎么声明的

//C语言可以这样声明
int InitList(sqList *L)

sqList L
int n=InitList(&L);

如果是C++可以这样声明
int InitList(sqList &L)

sqlList L
int n=InitList(L)

durant 2012-02-19
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分

69,371

社区成员

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

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