指针数组问题.........

wula0010 2021-03-04 06:32:39
c++指针没学好,请教个问题,


boolean fun(char* pszPath)
{
char szFileList[][MAX_PATH * 2] = { 0 };
int iNum=searchFile(pszPath, szFileList[][MAX_PATH * 2]);

//处理完成后如何安全释放内存

}

int searchFile(char* pszDirectory, char szFileList[][MAX_PATH * 2])
{
......
//查找文件
char szFindFileName[MAX_PATH * 2] = { 0 };
//查找的文件名存在szFindFileName,如何加入szFileList,返回
......

//返回查找到的文件数量
return inum;
}
...全文
142 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2021-03-05
  • 打赏
  • 举报
回复
22: strncpy(szFileList[imun],szFindFileName,MAX_PATH * 2-1); 22: strncpy(szFileList[inum],szFindFileName,MAX_PATH * 2-1);
赵4老师 2021-03-05
  • 打赏
  • 举报
回复
23 :szFileList[imun][MAX_PATH * 2-1]=0; 23 :szFileList[inum][MAX_PATH * 2-1]=0;
赵4老师 2021-03-05
  • 打赏
  • 举报
回复
#define MAX_FILE 1000
boolean fun(char* pszPath)
{
    static char szFileList[MAX_FILE][MAX_PATH * 2] = { 0 };
        int iNum=searchFile(pszPath,  szFileList[][MAX_PATH * 2]);

        //处理完成后不用释放

}

int searchFile(char* pszDirectory, char szFileList[][MAX_PATH * 2])
{
     inum=0;
     ......
     //查找文件
     char szFindFileName[MAX_PATH * 2] = { 0 };
    //查找的文件名存在szFindFileName,如何加入szFileList,返回
    if (inum>=MAX_FILE) {
        fprintf(stderr,"in searchFile() inum>%d! The extra will be ignored !\n",MAX_FILE);
        return inum;
    } else {
        strncpy(szFileList[imun],szFindFileName,MAX_PATH * 2-1);
        szFileList[imun][MAX_PATH * 2-1]=0;
        inum++;
    }

    //返回查找到的文件数量
    return inum;
}
wula0010 2021-03-05
  • 打赏
  • 举报
回复
查找到的文件是多个,不是一个,
赵4老师 2021-03-05
  • 打赏
  • 举报
回复
万一malloc失败了咋办?
qq_40162781 2021-03-05
  • 打赏
  • 举报
回复
在栈创建的对象不用释放
qq_40162781 2021-03-05
  • 打赏
  • 举报
回复
bool fun(char* pszPath)
{
	char szFileList[10][MAX_PATH * 2] = { 0 };
	int iNum = searchFile(pszPath, &szFileList[0], 10);

	//处理完成后如何安全释放内存

}

int searchFile(char* pszDirectory, char szFileList[][MAX_PATH * 2], int size)
{

		//查找文件
		char szFindFileName[MAX_PATH * 2] = { 0 };
		int inum = 0;
	//查找的文件名存在szFindFileName,如何加入szFileList,返回
		for (int i = 0; i < size; i++)
		{
			if (strcmp(szFileList[i], szFindFileName) == 0)
				inum++;
		}

		//返回查找到的文件数量
		return inum;
}
wula0010 2021-03-05
  • 打赏
  • 举报
回复
最后改成字符串指针:

boolean fun(char* pszPath)
{
    char *pszFileList = NULL;
	char *pszFile = NULL;
	int iPos = 0;

	int iFiles = searchFile(pszFilePath);

	pszFileList = (char *)malloc(iFiles * (MAX_PATH * 2));
	*pszFileList = '\0';
	searchFile(pszFilePath, pszFileList);
	
	if (NULL != pszFileList)
		free(pszFileList);

	pszFileList = NULL; 
}
 
int 	int searchFile(char* pszDirectory, char *pszFileList)
  {
  	....
  	do
  	{		
  	    if (pszFileList != NULL)
  			{
  				//strcpy_s(pszExcelFileList + iPos, sizeof(szTempSrc) + 1, szTempSrc);
  				strcat_s(pszExcelFileList, strlen(pszExcelFileList) + strlen(szTempSrc) + 1, szTempSrc);
  				iPos += strlen(pszExcelFileList);
  				iPos += 2;
  				strcat_s(pszExcelFileList, iPos, "|");							
  			}
  			iFiles++;
  	} while (......);
  	....
  
  	return iFiles;
  }
这么做的麻烦之处在于:返回的多个文件名,拼接成一个字符串,要用文件名的时候,要自己分割字符串,但也好用。
赵4老师 2021-03-05
  • 打赏
  • 举报
回复
你用vector,文件多到内存不够用时,可能更麻烦。
wula0010 2021-03-05
  • 打赏
  • 举报
回复
引用 8 楼 赵4老师 的回复:
#define MAX_FILE 1000
boolean fun(char* pszPath)
{
    static char szFileList[MAX_FILE][MAX_PATH * 2] = { 0 };
        int iNum=searchFile(pszPath,  szFileList[][MAX_PATH * 2]);

        //处理完成后不用释放

}

int searchFile(char* pszDirectory, char szFileList[][MAX_PATH * 2])
{
     inum=0;
     ......
     //查找文件
     char szFindFileName[MAX_PATH * 2] = { 0 };
    //查找的文件名存在szFindFileName,如何加入szFileList,返回
    if (inum>=MAX_FILE) {
        fprintf(stderr,"in searchFile() inum>%d! The extra will be ignored !\n",MAX_FILE);
        return inum;
    } else {
        strncpy(szFileList[imun],szFindFileName,MAX_PATH * 2-1);
        szFileList[imun][MAX_PATH * 2-1]=0;
        inum++;
    }

    //返回查找到的文件数量
    return inum;
}
static char szFileList[MAX_FILE][MAX_PATH * 2] = { 0 };这样定长数组是简单了,但是如果文件多,数组长度超了,就麻烦了。
wula0010 2021-03-05
  • 打赏
  • 举报
回复
引用 6 楼 gouyanfen 的回复:
你应该是类似要实现遍历目录文件的功能吧,你可以用list或vector struct { long filesize; char filename[128]; ... }findfile; vector <fildfile *>user_file_list; int searchFile(char* pszDirectory, vecotor * findfile szFileList) [quote=引用 5 楼 wula0010 的回复:][quote=引用 2 楼 gouyanfen 的回复:]预定义MAX_PATH 之后,这样定义没问题,空间分配在栈上,函数返回自动就释放掉了 char szFileList[][MAX_PATH * 2] = { 0 }; 下面这样定义函数有问题吧 int searchFile(char* pszDirectory, char szFileList[][MAX_PATH * 2]) 可以定义为 int searchFile(char* pszDirectory, char **szFileList)
函数定义没有问题..................[/quote] 就算没问题,你需要内部带回内容的,必须定义为指针[/quote] vecotor 不会用,看来要好好学习了.........................
赵4老师 2021-03-05
  • 打赏
  • 举报
回复
加static前缀的局部变量大数组分配在全局数据区,不分配在栈区,何来导致栈溢出?
NorZ 2021-03-05
  • 打赏
  • 举报
回复
不是动态分配的内存,不需要手动释放 不过你这个二维数组,如果有某一维长度不固定,就需要动态分配 赵4老师就是直接帮你限制一维长度最大1000,如果你用不了这么大,就不存在问题 只是需要考虑局部变量大数组太多会导致栈溢出的问题 再像上面说的,既然你都用c++了,直接用vector<string> 也是可以的,但看你的写法,完全是C的 如果不能用 vector ,又想用动态分配内存到堆上,那你就得先获取一维的长度,分配内存空间,再去拿文件名
gouyanfen 2021-03-04
  • 打赏
  • 举报
回复
你应该是类似要实现遍历目录文件的功能吧,你可以用list或vector struct { long filesize; char filename[128]; ... }findfile; vector <fildfile *>user_file_list; int searchFile(char* pszDirectory, vecotor * findfile szFileList)
引用 5 楼 wula0010 的回复:
[quote=引用 2 楼 gouyanfen 的回复:]预定义MAX_PATH 之后,这样定义没问题,空间分配在栈上,函数返回自动就释放掉了 char szFileList[][MAX_PATH * 2] = { 0 }; 下面这样定义函数有问题吧 int searchFile(char* pszDirectory, char szFileList[][MAX_PATH * 2]) 可以定义为 int searchFile(char* pszDirectory, char **szFileList)
函数定义没有问题..................[/quote] 就算没问题,你需要内部带回内容的,必须定义为指针
wula0010 2021-03-04
  • 打赏
  • 举报
回复
引用 2 楼 gouyanfen 的回复:
预定义MAX_PATH 之后,这样定义没问题,空间分配在栈上,函数返回自动就释放掉了 char szFileList[][MAX_PATH * 2] = { 0 }; 下面这样定义函数有问题吧 int searchFile(char* pszDirectory, char szFileList[][MAX_PATH * 2]) 可以定义为 int searchFile(char* pszDirectory, char **szFileList)
函数定义没有问题..................
forever74 2021-03-04
  • 打赏
  • 举报
回复
碰到提交按钮了 就是strcpy(szFileList[i],szFindFileName); 前提是你知道那行空闲或者可用。
forever74 2021-03-04
  • 打赏
  • 举报
回复
从语义上我不能理解为什么要把szFindFileName加入szFileList, 但是你确实需要的话,就是在szFileList找到个空闲行,然后strcpy进去即可。
gouyanfen 2021-03-04
  • 打赏
  • 举报
回复
预定义MAX_PATH 之后,这样定义没问题,空间分配在栈上,函数返回自动就释放掉了 char szFileList[][MAX_PATH * 2] = { 0 }; 下面这样定义函数有问题吧 int searchFile(char* pszDirectory, char szFileList[][MAX_PATH * 2]) 可以定义为 int searchFile(char* pszDirectory, char **szFileList)
快乐胖电工 2021-03-04
  • 打赏
  • 举报
回复
数组的尺寸,貌似不能用变量吧。得用一个常数,比如,10,100。如果MAX_PATH是你预定义的也行,但不能*2。这样定义后,数组内存自动释放。

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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