分配内存的问题
先定义个Node结构体
- C/C++ code
typedef struct _Node{ struct _Node *next; struct _Node *prev; char *data; int flag;}Node;typedef struct _List{ Node *head; Node *tail;}List;然后分配静态节点空间
- C/C++ code
p = (Node *)malloc(sizeof(Node) * n);
最后在引用时出问题
- C/C++ code
List *cList = malloc(sizeof(Node) * 2);cList->head = &p[0];cList->tail = &p[n-1];
运行到这一句出错:
- C/C++ code
cList->head->next = &p[1];
我以为是静态节点地址引用错误打印出来发现很诡异
- C/C++ code
for(i = 0; i < n; i++) { printf("p[%d]:%d\n", i, p[i]); printf("%d\n", &p[i]); }输出结果:p[0]:179048544179048544p[1]:179048576179048576p[2]:179048608179048608p[3]:179048640179048640p[4]:179048672179048672p[5]:179048704179048704按照我的理解p[i]应该是对应数据,而&p[i]才对应地址啊。。在另一个程序里测试是如我的理解,但为什么在这个程序里却是这样呢?
[解决办法]
p就是一个指针数组啊
p[i]为某个Node *
[解决办法]
p的类型是什么?
p[0],p[1]的差值应该是16才对,怎么是32?
是贴上来的代码与实际不一致吗?
[解决办法]
cList->head->next
这里的next指向了哪呢?
[解决办法]
List *cList = malloc(sizeof(Node) * 2);
啥意思?
一个 List 的结构体指针,你给他按 Node 结构体分配内存?
[解决办法]
p[0]:-842150451
4398000
p[1]:-842150451
4398016
p[2]:-842150451
4398032
p[3]:-842150451
4398048
sizeof(Node)=16
Press any key to continue
[解决办法]
[解决办法]
[解决办法]
最后在引用时出问题
List *cList = malloc(sizeof(Node) * 2);
cList->head = &p[0];
cList->tail = &p[n-1];
应该为
List *cList = malloc(sizeof(List));
cList->head = p[0];
cList->tail = p[n-1];
请楼主思考一下,是否如此?
[解决办法]
&p[n] 是数组 的地址, p是数组元素的首地址
[解决办法]
仅供参考
- C/C++ code
//将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>