- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在用 C 编写一个程序来检查循环符号链接(symbolic link)。该策略是创建一个结构文件信息:
typedef struct fileInfo fileInfo;
struct fileInfo {
ino_t inode;
dev_t devID;
};
这将存储文件的 inode 和 devID。我们创建这些结构的数组,并在每次打开新文件之前检查该文件是否已经存在。如果是这样,那么它就是一个循环链接。
void func1(...)
{
fileInfo **fileData = malloc(sizeof(struct fileInfo*));
int fileDataLen = 0;
char* path = "path of file";
/* some flags */
func2(path, fileData, &fileDataLen);
for (int i = 0; i < fileDataLen; i++)
free(fileData[i]);
free(fileData);
}
void func2(char* path, fileInfo ** fileData, int * fileDataLen)
{
//try to open file
struct stat buf;
if (openFile(file, &buf, followSymLinks) == -1)
exit(1);
fileData = checkForLoops(fileData, fileDataLen, &buf, file);
if (S_ISDIR(buf.st_mode))
{
char* newPath = /* modify path */
func2(newPath,fileData, fileDataLen);
}
/* other stuff */
}
int openFile(char* file, struct stat * buf, fileInfo ** fileData, int * fileDataLen)
{
if (lstat(path, buf) < 0)
{
fprintf(stderr, "lstat(%s) failed\n", path);
return -1;
}
return 0;
}
fileInfo** checkForLoops(fileInfo **fileData, int * fileDataLen,struct stat *buf,
char* path)
{
for (int i = 0; i < (*fileDataLen); i++)
{
if (fileData[i]->inode == buf->st_ino &&
fileData[i]->devID == buf->st_dev)
fprintf(stderr, "circular symbolic link at %s\n", path);
}
fileInfo *currFile = malloc(sizeof(struct fileInfo));
memcpy(&currFile->inode, &buf->st_ino, sizeof(buf->st_ino));
memcpy(&currFile->devID, &buf->st_dev, sizeof(buf->st_dev));
fileData[(*fileDataLen)] = currFile;
(*fileDataLen)++;
fileData = realloc(fileData, ((*fileDataLen)+1) * sizeof(struct fileInfo*));
return fileData;
}
但是,我注意到,在调用 func2() 几次之后,出现了内存泄漏,并且 fileData 没有指向任何内容。我只是不确定泄漏是从哪里来的,因为我没有在 func2() 中释放任何东西。我假设有一些 realloc
恶作剧,但我不明白为什么。将不胜感激!
最佳答案
我注意到代码中有一些奇怪之处。
首先,openFile
的函数签名有一个void
的返回类型,但是您在这里检查返回值:
if (openFile(file, &buf, fileData, fileDataLen) < 0)
其次,正如 Peter 还指出的那样,您在调用 realloc
时没有分配足够的空间:
fileData = realloc(fileData, (*fileDataLen) * sizeof(struct fileInfo*));
在第一次迭代中,(*fileDataLen) == 0
,在递增 *fileDataLen
之后,您现在只有一个值 1
,这意味着你没有重新分配任何东西(即,你只是传回 fileData
已经指向的内存,因为它没有改变分配数组的大小)。因此,下次您在另一个递归调用期间调用 fileData[(*fileDataLen)] = currFile;
时,您将复制 currFile
的值到 fileData [1]
,但该内存尚未分配。此外,下次调用 realloc
时,它可能不再在同一位置重新分配内存,因此 fileData
将指向一个完全不同的位置,只有复制过来的第一个数组条目。
第三,您不能在 func1()
中调用 free(fileData)
,因为您需要在 中调用
函数,更改了内存指向的值,并且您没有通过引用您的 realloc
func2()func2( )
函数。换句话说,如果在 func1()
中对 malloc()
的调用返回了一个值,比方说 0x10000,并且您在分配的那个上调用了 realloc
代码中其他地方的内存,在 0x10000 分配的内存现在已经移动到其他地方,但是 func1()
的本地范围上下文中的 fileData
的值仍然是 0x10000。因此,当您有效地调用 free(0x10000)
时,这就是您调用 free(fileData)
时发生的情况,您将得到一个错误,因为数组的内存是不再分配在 0x10000。为了释放数组,您要么必须从对 func2()
的所有递归调用中返回指向指针数组的更新指针,要么将 fileData
传递给引用,这意味着 func2()
和 openFile()
的函数签名需要更改为 fileInfo***
类型,并且您每当在 func2()
和 openFile()
中访问 fileData
时,您还需要一个额外的间接层。然后,当您在其他任何地方调用 realloc
时,您实际上是在修改 fileData
的值,因为它也在 func1()
中分配,并且可以在该指针上调用 free()
。
最后,请记住,如果您只释放为 fileData
分配的内存,那么对于堆,因为 fileData
只是指向节点的指针数组,而不是实际节点本身。
关于c - C中奇怪的内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7362323/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!